yuchi's Development Home
글 수 201
[서버용 네트웍 컴포넌트 ]
4DyuchiNET20.dll, 4DyuchiNET20_x64.dll
- In-Process COM
-기존 방식과 유사한 인터페이스로 완전히 재작성
-x64, x86 지원 , 스레드세이프
- 약 15일 소요
[3D 게임 엔진]
범용 자료구조 라이브러리
4DyuchiGXGenericLib.dll,4DyuchiGXGenericLib_x64.dll
수학함수 라이브러리
4DyuchiGXMathLib.dll,4DyuchiGXMathLib_x64.dll
2D 이미지 프로세싱 라이브러리
4DyuchiGXImageProcessingLib.dll,4DyuchiGXImageProcessingLib_x64.dll
In-Process COM 파일시스템
4DyuchiGXFileStorage30.dll,4DyuchiGXFileStorage30_x64.dll
In-Process COM 렌더러엔진(Device Dependent)
4DyuchiGXRenderer30.dll,4DyuchiGXRenderer30_x64.dll
In-Process COM 지오메트릭엔진(Device Independent)
4DyuchiGXGeometry30.dll,4DyuchiGXGeometry30_x64.dll
모델뷰 - 모델 확인 ,애니메이션 테스트,메터리얼 체인지 테스트, 어태치 테스트등
ModelView.exe , ModelView_x64.exe
건물 가이드매쉬 모델링,지형 편집,라이트맵계산,오브젝트 배치,충돌매쉬 빌드 등...
4DyuchiGXLevelEditor.exe , 4DyuchiGXLevelEditor_x64.exe
파일 패키징,추출 등....
4DyuchiGXFilePack.exe , 4DyuchiGXFilePack_x64.exe
-x86, x64지원
-피직 트랜스폼, 벡터 연산, 기타 많은 cpu클럭을 소모하는 수학연산에 대해 x86, x64모두 SSE 코드로 최적화
-SSE코드 및 불가피한 어셈블리 코드 작성에는 vc++인라인 어셈블러(x86버젼)와 ml64.exe(x64버젼) 사용
-대략 1개월 소요
-퍼포먼스는 x86에 비해 x64버젼이 근소하게 높음. 대량의 메모리간 데이타 전송이 이루어질 경우에 x64 모드가 빛을 발하는데, 엔진이 이미 최대한 최적화되어있어 메모리 카피 코드가 극히 적으므로 큰 효과를 기대하긴 어려움.
[후기]
이 짓거리를 왜 하게 되었는고 하니...
한마디로 서버를 64비트 환경으로 돌리고 싶었다.
서버에서 3D충돌처리를 하다보니 렌더러를 제외한 3D엔진을 DLL형태로 갖다 쓰게 되었고, 3D엔진도 64비트 프로세스에서 작동해야만 했다.
꼭 이렇게까지 해야하느냐? 라고 묻는다면...반드시 그래야한다고 말 할 수는 없다. 개인적인 욕심도 없다고는 못한다.
작년만 해도 64비트 포팅에 대해서 대단히 회의적이었다. 사실 네트웍부터 엔진, 기타 샘플 서버등을 다 합치면 7년정도 짠 코드들을 몽땅 뒤집어엎어야 할 판이었으므로 도저히 자신이 없었다.
새 직장에서 워밍업으로 처음 시작한 일이 네트웍 컴포넌트를 64비트 버젼으로 다시 만드는 일이었는데, 테스트까지 15일 정도 걸렸다. 생각보다 일을 빨리 끝냈다.
막상 서버 컴포넌트를 64비트 코드로 작성하고 나니 아쉬움이 많이 남았다.
최소한 파일 시스템과 범용 자료구조 라이브러리만큼은 64비트 모드를 지원해야 서버를 64비트 프로세스로 돌릴 수 있었으므로 약간 고민이 되었다.
15일만에 64비트 버젼의 서버 컴포넌트를 만든 덕에 겁대가리를 좀 상실한 상태였다.
결국 큰 결심을 하고 파일 시스템과 범용 라이브러리부터 뒤집어 엎기 시작했다. 예상 기간은 3-6개월 정도.
7년간 떡칠해놓은 어셈블리 코드들과 메모리 옵셋을 사정없이 건드리는 코드들 때문에 꽤 애먹었다. 특히 어셈 코드가 문제였다.
때문에 인텔 컴파일러 사용을 심각히 고려했었다. vc2005의 x64플랫폼에서는 인라인 어셈을 사용할 수 없었기 때문이다.
그러나 인텔 컴파일러는 사실상 사용이 불가능했다.
기존 자료구조 코드들이 어셈으로 떡 쳐놓은 코드들이었기에(공부한다고 mmx코드까지 발라놨었다) 퍼포먼스에서 유리한 점이 없는 코드들은 대부분 C로 재작성했다.
수학함수와 가변인자 처리, DPC,문자열 처리, N비트 비트맵 처리 등에선 어셈블리 코드 사용이 불가피했기 때문에 x86 코드는 인라인 어셈으로, x64코드는 vc에디터와 ml64.exe를 사용해서 순수 어셈으로 작성했다.
자료구조 코드들은 대부분 2000년 - 2001년에 작성한 것들이고 어셈공부한다고 c코드는 아예 지워버린 케이스가 많아서 C로 작성하는것도 쉽지는 않았다.
2004년에 밤새면서 짰던 힙 메모리 부분이 특히 힘들었다. 어찌나 헷갈리던지...
하여간 난관을 하나하나 극복은 해갔는데, 몇 가지 부분에선 어셈블리 코드를 빼는게 정말 아쉬웠다. 대표적인 사례가 스택 부분.
예전엔 push/pop명령을 인라인으로 사용해서 시스템의 스레드 스택을 바로 사용했었는데, 때려죽여도 x64에선 방법이 없어서 포기했다.
대신 CStack자료구조를 만들어서 C++스타일의 코드로 대체했다. 퍼포먼스가 약간 떨어져서 유감이긴 하지만, 32,64비트 모두 지원하려니 어쩔수 없었다.
평일 근무시간은 물론이고 주말,휴일,새벽 나름대로 쓸 수 있는 시간은 다 동원해서 쳐발랐다.
7년간 작성했던 코드들을 대부분 리뷰했고, 새로운 것도 많이 학습했다.
막연하게만 알고 있던 매크로어셈에도 꽤 능숙해졌고, x64 어셈블리코드와 호출규약, 코드생성 규칙 등에 대해서도 꽤 많은 공부를 했다.
[결론]
덕택에 많은 공부를 했고, 숨어있던 버그도 잡았고, 앞으로 진행하기 위한 발판을 다졌다. 든든한 갑옷을 챙겨입은 기분이다.
그리고....
재밌었다. 난 역시 프로그래머 체질이야.
뒤에서 보기에도 대단했음 ㅋㅋ