최적화 기법들이라고 말도 안되는 제목이지만 요번에 하면서 최적화라는거에 대해서 생각을 많이 하게 됬습니다.
일단 Draw call(드로우 콜)이라는 걸 줄이기 위해서 Instanced Static Mesh(ISM)를 사용 했습니다. 뭐 Hierchical Instanced Static Mesh(HISM)도 있지만 이건 제대로 적용을 못해봐서... 이건 Batching 이라는 기술을 언리얼에서는 이렇게 하는거랍니다. 제대로 이해하려면 openGL까지 가야되지만 일단 간단하게 이해한거로는 말 그래도 화면에 그릴거를 줄이는 겁니다. 간단하게 공통적으로 메쉬나 머터리얼을 쓰면 하나로 그릴수 있다 입니다. 제가 한 예로 들자면 비행기 게임에서 총알을 쏩니다. 간단하게 Spawn Actor 로 총알을 계속 생성 하면 그 생성된 수 만큼 드로우 콜이 올라갈겁니다. 빨리지나가던 멀리 있던 작던간에 하나의 드로우 콜이 됩니다. 이걸 확인하는 방법은 stat scenerendering 으로 보시면 됩니다. 여기서 좀 헤멧던게 충돌체크와 렌더링을 따로 분리 해야된다는겁니다. ISM을 써서 총알을 추가하고 Tick 마다 Transform을 업데이트 해줘서 이동하는거는 했는데 충돌은 안됩니다. 이건 렌더링에만 영향을 미치나 봅니다.(가만 생각해보면 그러겠죠...) 그래서 저는 이렇게 했습니다 Spawn Actor가 되면 콜리젼 박스하고 Projectile movement가 있는 총알을 만들고 똑같이 ISM을 추가하는겁니다. 콜리젼 담당과 렌더링 담당을 따로 했다고 보시면 됩니다. 이걸 또 sync 해야하고.. 하튼 Draw call을 줄이는 방법으로 이런걸 해본건 아주 좋은 경험 이었떤거 같습니다. 앞으로는 HISM을 해서 LOD같은것도 건드려 보고. Instanced Material 같은것도 해봐서 머터리얼도 이렇게 해보고 공부할게 많은거 같습니다.
이건 제대로 못 해본건데 메모리 풀? 인가 오브젝트 풀인가 정확한 용어를 모르겠네요. 이것도 해봐야 합니다. ISM을 하다 보면서 Spawn Actor / Destroy Actor를 하다가 든 생각인데 이것도 계속 이걸 하는 것 보단 Destroy를 안하고 재사용을 하는 겁니다... Destroy가 필요한 시점에 set hidden in game 이나 set visibility를 해서(찾아본 봐로는 set hidden in game 도 하고 set tick enabled도 false로 하고 이것저것 건드려야 하는게 많은거 같네요) 화면에서 안보이게 하고 총알이 필요할때 Transform 위치하고 다시 가져와서 다시 쓰는거죠.
대충생각한 로직으로는 이렇게 하면 될것 같은데 또 실제로 해바야겠죠.
1. 총알 쏘는 인풋이 들어왔따
2. 현재 안쓰고 있는 총알이 있는지 본다(set hidden in game 된거요)
3. 쓸수 있는 총알이 없으면 새로 Spawn 한다
4. 다쓴 총알은 set hidden in game로 해서 안쓰는 총알 목록에 추가한다
이걸 ISM하고 결합하면 배열에 추가 없애주고 하는게 확실히 직접 해봐야 할 것 같습니다. 또 보니까 tick도 성능에 영향을 꽤 미치는거 같더라고요. 이렇게 간단한 총알같은 경우는 이걸 생각하면서 동적 메모리 할당 아니면 ISM의 배칭 기술의 오버헤드 같은걸 보면서 확실히 기본기를 다시 다져야 하겠다는 생각이 드네요.
또 본의아니게 수학 때문에 발목을 잡히는 일이 생겼네요. 비행기 게임들 보면 레이더 시스템이 있잖아요. 적이 화면에 보이면 세모로 표시된다거나 미사일이 날라오면 표시된다거나 화면 밖에 있으면 화살표로 적의 위치를 알려준다거나 하는거요. 그걸 구현하는데 수학 떄문에 애먹었네요. 저는 간단하게 ATAN2, SIN, COS 정도만 해서 구현했는데 보니까 내적, 외적 사용했으면 훨씬 쉬웠겠네요... 수학도 역시 해야합니다. 적어도 선형대수만 이라도 먼저 해야겠네요. 일단 거의 완벽히 구현은 되서 만족스럽습니다 ㅎㅎㅎ 더 해야할것도 있지만 기본적으론 만족스럽습니다 ㅎㅎ 이거 보여드릴수도 없고 ㅎㅎ(...는 사실 가능하지만 부끄러워서 올릴수가 없네요...)
그 외에 여러가지 최적화 방안에 대해서 시작만 한 느낌입니다. stat fps, stat unit, stat scenerendering, stat game, stat startfile, stat stopfile 등등등...그 외에 기억안나는 명령어들... 되게 많은데 제가 지금은 손댈수 없는 영역이여서.... 텍스쳐를 합친다던가 폴리곤수 instruction등등 에셋들을 최적화 하는것들 성능을 최적화 하는것들(무조건 openGL 까지 내려 가야하나 봅니다 이것도) Batching 이라는거 설명 보면서 openGL이 함수 하나하나 들을 부르는걸 이해해서 오버헤드를 줄이는 방법을 생각해 내는거 여서요..
오늘은 머리가 아파서 그런지 써놓고도 문장문장 하나하나가 다 연결이 안되는거 같고 이상하지만 그냥 아무말 이라도 뱉어 봅니다...(안그러면 영원히 포스티이 없을듯...)
'~ 공부 ~ > Computer' 카테고리의 다른 글
일몰제161128 - C++(feat. 언리얼) (0) | 2016.11.28 |
---|---|
일몰제161128 - 코드랩(D3), 유니티 로드쇼 (0) | 2016.11.28 |
일몰제2편 - 언리얼(전반적, VR) (0) | 2016.10.28 |
역시 일기는 몰아써야 제맛 6편(마지막, 즐추요) - 파이썬("리스트에 왜 빼기는 없죠?") (0) | 2016.09.14 |
역시 일기는 몰아써야 제맛 5편 - tweepy 해보기 (2) | 2016.09.14 |