yuchi's Development Home
글 수 201
mmorpg프로젝트다보니 이래저래 작업을 하다보면 클라이언트를 몇개씩 띄워야할 때가 많다.
메모리를 100메가가 넘게 쳐먹는 클라이언트를 여러 개 띄우려면 꽤나 짜증이 난다.
일단 옆에 둔 노트북이 큰 도움이 되긴 하지만서도.
로딩시간도 그렇고 화면이 계속 갱신되는데다, 마우스랑 키보드 컨트롤 게임이다보니 디버깅 하려고 콘솔을 조작하면 게임 상태도 계속 영향을 받는다.
해서 한 프로세스로 여러 개의 클라이언트를 시뮬레이션 해주는 놈을 만들기로 결정.
멀티플 클라이언트라 이름지었다.
대충 레이아웃은 잡았고 기본접속 테스트 및 이동처리, 화면에 디스플레이 기능까지 구현하고 스샷으로 찍었보았다.
아직 UI가 완벽하진 않지만 스페이스바를 누를때마다 가상클라이언트를 새로 만들어서 서버에 접속시킨다.
우측 창에는 현재 띄워져있는 가상클라이언트 리스트가 출력된다. 캐릭터별로 존재하는데 셀렉트 해주면 해당 가상 클라이언트가 active된다.
이에 따라 좌측의 맵 뷰에도 active된 클라이언트의 상태가 디스플레이 된다.
터미널 클라이언트나 vmware로도 사용할 생각이므로 3D 그래픽은 사용하지 않았다. 즉 엔진의 렌더러는 NULL디바이스를 사용했다.
그렇지만 이동처리와 충돌처리,타격판정등은 게임 그대로 시뮬레이션 해야하므로 내부적으로는 서버와 같이 3D엔진의 4DyuchiGXGeometry30.dll을 그대로 사용한다. 출력만 2D다.
보기엔 허접해보이지만 내 프로그래밍 기술은 다 들어갔다.
1. DDraw와 0번압축 스프라이트 처리
2. IOCP 네트웍 모듈
3. 3D엔진
4. MFC
있던 기술 써먹은 것과는 별도로 엔진에 추가한 중요한 기능이 있는데 [씬그래프 자료구조 공유] 기능이다.
게임플레이에 필요한 3D데이타를 얼마나 공유시키느냐 하는 것은 서버에서 인던 구현시 메모리 사용량과 밀접한 관련이 있다.
마찬가지로 멀티플 클라이언트에서도 몇 개의 클라이언트를 시뮬레이션 할 수 있을지는 메모리 사용량에 달려있다.
충돌검출이나 타격판정에 필요한 3D데이타는 렌더러 유무에 상관없이 씬그래프에서 관리된다. 씬 그래프의 자료구조를 공유할 수 있다면 상당히 많은 수의 씬그래프를 복제해서 만들어도 메모리 사용량은 크게 증가하지 않는다.
이 기능이 멀쩡하게 동작한다면 서버에서의 인스턴스 던젼과 멀티플 클라이언트 모두 구현 가능한 것이다.
따라서 씬그래프의 대부분을 공유할 수 있음을 멀티플 클라이언트로 증명해야했다.
새로운 씬 그래프가 기존의 씬 그래프를 복제할때 BSP트리와 ROOM/PORTAL 구조는 COPY하도록 했고, 가장 메모리를 많이 먹는 충돌처리 구조는 모듈 그대로를 공유시켰다(AddRef(),Release()사용)
몇일동안 삽질했지만 현재는 잘 작동한다.
맵 하나 더 생성(씬그래프 공유를 이용해서)할때마다 평균 3MB이내로 소모하므로 원래 목적도 충실히 달성한 편이다.
다시 멀티플 클라이언트로 돌아와서, 이제 한 50% 만든거 같은데 코딩량이 엄청나게 많고 테스트도 많이 해야해서 꽤 애먹고 있다.
기술적인 난이도가 높은 것보다도 시간에 비해 구현해야할 기능의 양이 너무 많다.
MFC와 현재 CS구조에 능통한 사람이 있다면 맡겨버리고 싶은 심정이다.
목요일마다 개밥먹는게(전체 테스트)가 상당한 장애요인으로 작용하고 있다.
목요일 테스트를 하려면 수요일엔 전체 빌드를 위해서 데이타를 취합하고 자잘한 버그 잡고 테스트를 해야한다.
코딩에 집중할 수 있는 날은 월,화,금 뿐이다. 이것도 다른 문제가 없을때 얘기지.
휴..하여간 짜증나서 돌아버릴거 같은 상황을 어떻게든 극복하며 멀티플 클라이언트를 완성해가고 있다.
이게 제대로 돌아가면 이놈을 이용해서 인스턴스 던젼 구현으로 들어간다.
클라이언트 여러개 띄우고 디버깅 하려면...뉴_뉴
완전 매력있는 작업을 하고 계시네요...
핵심은 씬그래프 자료구조 공유인가봐요...
오늘도 화이팅입니다~~~!!!!!!!!!!!!!!!!