Post
유니티 3D 게임 프로젝트를 진행하게되면서 최적화의 중요성을 많이 알게되었습니다.
빌드자체에서 걸리는 시간이라던가 게임플레이 도중에 발생하는 지연이라던가 그런것들을 보며 구현도 중요하지만 구현한것을 원활하게 돌아갈 수 있도록 최적화하는것이 정말 중요하구나를 깨달으며 프로젝트에 적용한 최적화 방법을 소개할까 합니다.
부모-자식 간의 관계를 최소화로 하자
유니티에서 Hierarchy의 depth가 깊어지면 깊어질 수록 부모의 결과를 전파하기 위한 계산이 추가됩니다.
부모에 대한 position이나 rotation 등 정보가 변경되면 자식들에게도 메세지를 보내게 되므로 성능에는 악영향을 끼치게됩니다.
그래서 저는 프로젝트내에서 건설과 관련된 오브젝트를 맡았었는데..
왼쪽이 이전에 있던 오브젝트 하나이고, 오른쪽이 하나의 오브젝트를 다 떼어내어 따로 분류를 해놓은 부모-자식간의 관계를 최소화로 만든 Prefeb들입니다. 저는 원래 Building하나로 오브젝트 풀에 넣어 재사용했던것을 모두 다 떼어놓아 오브젝트들 모두 각자의 prefeb으로 해결했습니다.
확실히 왼쪽에 있었을때의 코드들도 항상 부모-자식을 참조하고 있었기에 좋은코드라고 볼 수 없었고 저도 만들면서 일단 완성하는거에 초점을 두자라고 생각을 하며 만들긴했어서 많이 더러웠습니다.
하지만 최적화에 신경을 쓰게 되면서 제가 만든 오브젝트가 정말 이상한모양이라는것을 깨닫고 오른쪽처럼 기존의 오브젝트들을 하나씩 다 떼어놓고 코드들도 정리하고나니 정말 보기에도 좋고 이해하기에도 좋은 결과물이 나왔습니다.
좀 더 확실한 결과를 보여드리기위해 profiler 을 이용해 비포&애프터 사진을 찍어 성능비교를 하고싶었으나, 프로젝트를 하는도중에 이전 결과물이 날아가버려 (ㅠㅜ..) 구체적인 성능을 비교할 순 없었습니다.
하지만 계층구조가 깊으면 깊을수록 자식들의 수가 많아져 그만큼 연산(Transform...)이 늘어나기때문에 속도를 위해서라도 부모-자식 간의 관계를 최소화하는것이 좋습니다.
'PROJECT > 유니티' 카테고리의 다른 글
[개발일지] 3. 챕터 추가 및 디자인수정 (0) | 2023.05.31 |
---|---|
[개발일지] 2. 화면 제작, 수집 컨텐츠 추가 (0) | 2023.04.28 |
[개발일지] 1. 코드 리팩토링 및 데이터변환 (0) | 2023.04.01 |
유니티 Navigation Bake하지않고 이동제한구역(장애물)설정하기 (0) | 2022.09.18 |
[REVIVER 개발일지] #0. 기획! 기획! 기획! (2) | 2022.09.11 |
Post
- Texture 또는 Material이 다를 경우 별도의 Draw call이 된다.
유니티는 씬의 Texture 또는 Material에 대해 별도의 Draw call을 발행합니다.
참고로 Draw call은 실시간으로 카메라를 통해 한 프레임의 화면을 만들어 내는 동안에 CPU가 GPU에게 오브젝트를 그려라 라는 명령을 내리는 것입니다. 이 DrawCall이 늘어나게되면 자동으로 GPU가 할 일이 늘어나게되며 성능이 떨어지게됩니다.
이런 경우에는 스프라이트 아틀라스를 써서 줄이는 방법이 있습니다. (2D 프로젝트에만 적용가능)
스프라이트 아틀라스(Sprite Atlas) 는 여러 개의 텍스처를 단일 텍스처로 결합하는 에셋입니다. Unity는 여러 개의 드로우 콜을 발행하는 대신 이러한 단일 텍스처를 호출함으로써 하나의 드로우 콜을 발행할 수 있습니다.
먼저 아틀라스를 만들기위해서는 ProjectSetting에 들어가서 SpritePacker의 Mode를 disable이 아닌 always Enabled로 바꿔줍니다.
그리고 프로젝트 창에서 Create- 2D-Sprite Atlas를 눌러줍니다. ( 왜인지는 모르겠지만 Sprite Atlas를 생성하는 버튼의 위치가 바꼈습니다.)
그리고 해당 material(image)가 있는 폴더를 Objects for Packing에 추가 후 Pack Preview 를 해줍니다.
Pack Preview를 하게되면 오른쪽과 같은 화면이 나오게됩니다.
다시 플레이를 해보면 Batches(Draw call + SetPass call)가 폴더안에 있는 이미지들을 하나로 묶어 표현한만큼 기존 4에서 1이 되었습니다.
현재 3D프로젝트를 하고있는입장에서.. 2D프로젝트에서만 쓰이는게 너무 아쉽긴하지만 Batches의 중요성을 깨닫게되면서 만약 제가 2D프로젝트를 하게된다면 최적화할때 유용하게 써먹을것같습니다.
'STUDY > 유니티' 카테고리의 다른 글
[C#] null을 비교하기위한 여정2, is 와 FakeNull (0) | 2023.01.21 |
---|---|
[C#] null을 비교하기위한 여정1, ==와 Equals() (0) | 2023.01.18 |
[Unity] 메지카복셀에서 내가 만든 캐릭터 유니티로 불러오기 (0) | 2022.09.10 |
[Unity] C# 문자열보간 (0) | 2022.08.02 |
[UniRx] UniRx에 대해서 알아보기 (0) | 2022.08.02 |