1) 시작
저는 G모사에서 K 게임을 개발하고 있는 현역 프로그래머입니다.
뭐... 자랑하려고, 이런글을 쓰는건 아니고, 게임 개발에 몸담고 있으면서, 체득한 경험이라든가, 문제에 대한 좋은 해법등을 공유해보기 위해 글을 연재 해볼까 합니다.

개중에는 별 쓰잘데기 없는 것도 있을수 있겠지만, 재미로 봐주셨으면 한다.

첫 번째 연재물은 캐릭터의 재활용입니다. 보통 게임에서 플레이어 캐릭터는 상당한 리소스를 차지합니다. 애니메이션 부터 각종 이펙트에 장비에 대한 리소스까지 꽤 무거운 오브제트중 하나이지요.

2) 구조
일단 게임의 구조 부터 살펴보죠. MMORPG 같이 한번 로딩 후에 별다른 로딩을 하지 않는 (그렇다고 아예 로딩을 안하는게 아니라 실시간 로딩이지만요) 게임에는 크게 상관없지만, Scene 단위로 작동하는 몇몇 캐쥬얼 게임등에서는 밑의 그림과 같은 구조를 가지고 있습니다.


1번 Scene은 게임 씬 이고, 2번 Scene은 상점 씬으로 생각해주세요. 일단 Scene이 하나 있으면 그 자식(Child)으로 Stage를 갖습니다. 그리고 그 Stage는 자식(Child)으로 Stage 위에 존재할 플레이어 캐릭터나 맵 오브젝트등이 있을겁니다. 가장 일반적인 구조지요.

그런데 여기에 문제가 하나 있습니다. 보통 Scene 전환이 이루어 지면, 기존 Scene 은 파괴 된다는거죠. Scene이 파괴되면 그 안에 있는 자식들도 모두 파괴가 됩니다. 그리고 다음 Scene으로 넘어가면서 그 Scene에 필요한 객체들을 새로 생성하게 됩니다. 그런데 플레이어 캐릭터 같은 것들은 보통 게임 처음 부터 끝까지 사용하지 않습니까? 그렇다면 플레이어 캐릭터의 삭제와 생성의 반복은 상당히 불필요해 보입니다.

2) 해결 방안
그래서 생각을 했습니다. 게임 처음부터 끝까지 플레이어의 캐릭터를 들고 있는게 어떨까? 하고 말이죠. 그래서 PlayerManager 클래스를 하나 추가했습니다.


오오~ 아름답군요.

새로운 방식은 기존의 Player가 Scene에 종속 되어 있던 것을 PlayerManager가 직접 Player를 관리하며, Scene에는 단순히 포인터를 넘겨주기만 하는 방식으로 바뀐거죠. 즉, PlayerManager에서 Player를 생성/소멸을 전부 관리하며, Scene에서 Player를 생성하려고 하면, PlayerManager에서 해당 Player가 있으면 포인터를 넘겨주고, 없으면 새로 생성해서 넘겨줍니다.

이렇게 하면, 계속 사용되는 Player를 처음부터 끝까지 가지고 있기때문에, 불필요한 생성/소멸이 없어지기때문에 그만큼 처리 비용도 줄어들게 되죠.

+ Recent posts