‘어느 정도로 만들어야 제대로 돌아갈 것인가’ 에 대한 내용입니다.
사실상 버텍스 수로 제한하려고 했던 것은 실패 OTL 일반적인 버텍스 수 제한으로는 답이 나오지 않습니다.
버텍스를 줄이는 것은 버텍스 처리 속도를 위해서가 아니라, 용량과 스키닝 등의 부하를 줄이기 위한 것이지, 버텍스가 줄어든다고 무작정 게임이 빨라지는 것은 아니라는 것을 알 수 있었습니다.
그렇다면 이제 남은 방법은 직접 게임을 돌려보면서 잡아내는 수 밖에 없지요.
전 맵을 다 돌면서 테스트하는 것도 진행해야겠지만, 일단 극초반 초벌테스트이므로 그렇게는 말고
가장 무겁다고 누구나 말하는 로마 지역을 기반으로 진행하였습니다.
테스트는 듀얼코어에 지포스 7600GS 입니다. 원래는 8600으로 할 생각이었지만, 패널티 부여한다고 생각하면서 7600으로 테스트하였습니다. 메모리는 1G.
옵션은 권장사양용 옵션으로 ‘보통’ 입니다. 그림자는 없고, 블룸X , DOFX(아래 사진에는 있습니다만), AnisotropicX , AAX 등등입니다.
스크린샷 캡쳐를 전용 프로그램 사용했더니 캡쳐하는 순간 프레임이 절반으로 하락해서 OTL 지금 보시는 프레임보다 약 두 배 정도라고 생각하시면 됩니다.
로마의 가장 무거운 지역이라는 곳에 캐릭터들을 30여종 올려놓고 테스트했습니다. 애니메이션 들어간 놈들도 있고, 최적화가 안된 놈들도 있습니다. 테스트용으로는 최적일듯.
저 멀리 피사의 사탑 보이는 뒷쪽으로 상당히 많은 수의 오브젝트가 존재합니다.
현재 데이터 분석을 해 보자면.. 프레임이 10 몇 프레임! 매우 느립니다.
이걸로는 안됩니다. 느리다는 얘기가 나오는게 당연할 듯.
DPcall은 1500. 쬐끔 많기는 하지만 권장에서 못버틸 정도는 아니라고 생각했는데 말입니다.
Tris 와 Vert 는 신경 안써도 됩니다.
오히려 VBO 쪽이 버텍스 양을 체크하는데 도움이 되지요. 31.6M 입니다. 좀 많기는 한 것 같네요. (상대적으로)
하지만 아직 개념을 정확히 잡지는 못하고 있습니다.
비디오 메모리는 200메가까지 쓰고 있습니다. 슬슬 한계가 보이려 하네요.
텍스쳐가 160메가를 사용하고 있습니다. 이걸 좀 어떻게 줄여야 로딩시간이 빨라질듯.
렌더 텍스쳐가 14개에 37.5 메가 ? 비디오 메모리의 15%?
그래서 이번에는 간단하게 프로파일링 분석해 봤습니다. 큰 것만 잡는 겁니다. 큰 것만.
아하.. TsGlobalLightColor가 40%나 잡아먹고 있네요 으흐흐.
이게 뭐냐면 각 맵에 따라 캐릭터의 Upper Color와 Lower Color를 자동으로 잡아주는 쉐이더 기능 보조의 스크립트입니다.
이건 원래 처음 시작할 때 한 번만 잡아주면 되는건데, 작업 편의를 위해서 매 프레임 잡게 되어 있습니다.
일단 막아버리면 되겠네요. 벌써 40% 퍼포먼스 향상 .
그다음에… 드로잉이나 렌더링이 느린건 사실 어쩔 수 없는 부분입니다. 그런데 컬링에서 15% 라는 이상한 숫자가 …
찾아보니 Water3 입니다. 바다에 사용하고 있는 부분이지요.
Water3라… 찾아보니 이거 물건입니다. Full 로 기능을 다 쓰면 엄청 무거운 녀석입니다만, 옵션이 다양해서 옵션만 줄이면 어떻게 될 수도 있을 것 같습니다. 가장 무거운 영역은 실시간 리플렉션 기능이네요.
반대쪽도 확인해 봤습니다. 역시나 비디오 메모리는 좀 위험하게 사용하고 있고, VBO는 30메가쯤 쓰고 있습니다. 일단 가설로, 30메가쯤 VBO를 쓰면 한계라고 해 둘까요.
텍스쳐 메모리는 160메가쯤 쓰고 있습니다. 줄이면 로딩시간과 비디오 메모리 여유분에 도움이 되긴 하겠지요. 그치만 대부분의 그래픽 카드가 최소 256 이상의 메모리를 가지고 있으니… 굳이 나서서 줄일 필요는 없어 보이기도 하고 말입니다.
분석해 봅니다. 역시 물과 Global light 기능이 문제입니다.
Global Light 기능은 어차피 고칠 거니까…

일단 이놈의 물 부터 어떻게 좀 해보겠습니다. 바다에서 뭔가 한다면 모르겠는데 그다지 중요하게 하는 것도 없고… 특히 실시간 반사 기능을 켜면, 화면 전체를 한 번 더 렌더링 하다시피 하니 느려질 수 밖에 없습니다.
비칠 것과 안 비칠 것을 제한하는 방법이 있던데, 응용해서 바닷물은 최적화를 사용해야 할 것 같습니다.
또한 땅 아래에도 바다가 있는데, 이런 경우 계속 렌더링 되고 있는것도 마음에 들지 않습니다.
그래서 이 두 가지 기능을 제거해 봤습니다. 강물은 가장 가벼운 물 쉐이더로 바꿔봤고, 바닷물은 옵티마이즈 옵션으로 가볍게 바꿨습니다. 글로벌 라이트 기능은 실시간 업데이트 하지 않고 Start 부분으로 빼서 한 번만 가동되게 만들어 봤습니다.
또한, 저 뒤 피사의 사탑에 있던 자질구레한 오브젝트들을 숨겨 보았습니다. 일종의 small object 옵션을 가상으로 실행시켜 본 거죠.
그 외에 옵션은 동일합니다.
보시면 알겠지만, 프레임이 대폭 상승하였습니다. 여기서 21프레임이 나온다는 말은 평소에는 30프레임 근방이 나온다는 뜻이니까요. 스크린 캡쳐 프로그램이 가동될때 갑자기 느려지는 증상이 일어납니다.
즉 위 두 가지만 해결했는데도 30프레임이 나온다는 말씀.
비디오 메모리나 텍스쳐, 버텍스 , DPcall은 거의 변화가 없는데 프레임이 두 배 이상 상승 . 예이!
그리고 여기서부터가 진짜입니다. 드디어 렌더가 가장 높게 나오는군요. 뎁스 텍스쳐를 업데이트 한다는 말은 디퍼드 렌더링을 위해서 Z 버퍼를 업데이트 한다는 말이겠지요.
그리고 드디어 메쉬.드로우 VBO (버텍스 버퍼 오브젝트) 가 나왔습니다. 버텍스 처리하는게 가장 무겁다는 말이겠지요.
처리는 초당 30프레임 정도로 할 수 있으나 어쨌건 돌리는건 가장 무겁다… 매우 좋은 기준이 나온 것 같습니다. 13.44ms 면, 상당히 높은 양이지요. 전체 렌더링 부하의 1/3 이니까요. 드디어 줄일 수 없는게 나왔습니다.
여기서부터는 정말로 오브젝트의 최적화 / 컬링 등으로 숨겨야 하겠지요. 이제부터가 진짜 최적화.
일단 자질구레한 오브젝트를 컴바인 mesh 기능 등으로 묶어주는게 필요할 듯 합니다. 또한 터레인 디테일도 조절해야겠고, 보이는 거리에 따른 스몰 / 미들 / 빅 오브젝트 레이어 설정까지 해주면 더 향상될 겁니다.
게다가 지금 DOF 같은 기능도 제대로 안 뺐단 말이죠. 이것도 개선될 여지가 있는 상태입니다.
그리고 드로잉이 23% 음 뭐 이게 디퍼드 렌더링 프로세스고…
어쨌건 꽤 무거운 캐릭터들이 ‘서로 다른 녀석들’ 이 30여종이 넘게 있는데도 30프레임이 나오고 있는건 매우 긍정적인 결과입니다.
물론 예상되는 반대급부도 있지요.
지형이 좀 썰렁하니 오브젝트가 보강될 겁니다. 이펙트도 보강될거고, 인터페이스도 제법 잡아먹을 겁니다.
그리고 나중에 로직도 들어가겠죠? 스키닝 수치도 늘어날 겁니다…
그렇지만 반대로 그래픽 카드가 올라갈테고 최적화 옵션과 옵션설정값들이 수정될 겁니다. 게다가 캐릭터들 중에서는 아직 폴리곤 정리도 안된 녀석들이 들어가 있겠구요. 물 쉐이더나 기타 쉐이더들도 가벼워 질 가능성도 있습니다.
이렇게 대충 때려보면, 안될 것 없겠지요?
자 그럼 이게 어떤 ‘좋은 기준’ 이라는 가설을 세워봅시다. 이정도가 ‘돌릴 수 있는 딱 적당한 수준’ 이라고 친단 말이죠.
캐릭터를 지워보고 배경만 남겼습니다. DOF도 없애고 옵션을 좀 만졌습니다.
아직 데이터가 하나뿐이기 때문에 귀납적 데이터가 되기에는 한참 모자랍니다만, 경험과 감각으로 때려맞추는 거죠 ㅋ
이렇게 해서 세운 1차 가설은 다음과 같습니다.
배경은 드로우콜이 가급적 1000 이하면 좋을 것 같습니다 .
트라이 / 버텍스 는 AT2에선 신경쓰지 마십시오.
대신 배경의 VBO는 400 이하, 30메가 이내면 좋겠습니다.
비디오 메모리도 배경에서는 100메가 안쪽으로만 사용하시면 좋겠네요. 더 줄이면 물론 좋구요. (VRAMusage)
대충 이정도면, 특별한 컬링 조건 없을 때 원활하게 돌아갈 수 있는 게임을 만들 수 있을 것 같습니다.
중요한건, 이게 1차 가설일 뿐이란 것입니다.
이제 앞으로 각종 맵을 탐방하면서, 위 조건이 타당한지 증명할 것입니다. 그리고 데이터들도 하나하나 보면서, 특별히 무거운 방식으로 만들어 지는건 혹시 없는지 , 더 좋은 방법은 없는지 찾을 것이구용.
그리고 곧장 쉐이더 정리부터 해야겠지요 휴우. ㅋ
부록 ———————————————————————————————
이 정도 데이터가 굉장히 안정적인 편이라는걸 증명하기 위해…
아까 캐릭터 있는 상태를 Fast 옵션으로 만들어 6600 (원래 최저사양으로 하려 생각했던 그래픽 카드) 로 돌려 봤습니다.
짜잔.
나무나 풀들이 대폭 사라지면서 DPcall이 작아지고 . 여러 수치들도 조금씩 좋아졌습니다.
그렇지만 20프레임 이상이 나오네요 즉 이 정도만 되면 7600 아니라 6600 에서도 옵션만 좀 조절하면 꽤 볼 만한 상태에서 잘 돌아간다는 것이 증명되었습니다. ㅎㅎㅎ

물론 7600보다 렌더링할때 더 힘들어 하는게 보이긴 합니다. 그렇지만 어쨌건 돌아는 간다는거.
조금 더 옵션 낮추고 최적화 기능 집어 넣으면 6600으로도 최저사양을 만들 수 있을 것으로 보입니다. :)