Unity / C# 스터디 정리 47 – 2D게임최적화

에디터와 게임을 최적화하는 방법은 구글을 해보면 알 수 있듯이 다양하게 있다. 그 중 가장 빠르고 효율적으로 최적화할 수 있는 방법만 정리해봤다. SpriteAtlasSprite Atlas는 게임에 사용하는 이미지를 정리한 것을 의미한다. 유니티 공식 가이드에서도 그 내용을 볼 수 있는데, (https://docs.unity3d.com/Manual/class-SpriteAtlas.html )가 Sprite Atlas의 역할은 이미지 주소 지정에 의한 동시 렌더링이다. 유니티의 경우 하나의 화면을 그릴 때 각 이미지에 대해 그림을 그리고 화면을 표현하는데, 이때 이미지가 개별적으로 존재할 경우 하나씩 이미지를 그려나가며 하나의 프레임을 채워나가게 된다. 이와 같이 하나의 프레임을 채우는 과정에서 발생하는 것이 DrawCall인데, 개별적으로 존재하는 이미지의 수가 증가할수록, 그리고 하나의 화면에 존재하는 이미지의 sort order와 layer가 다르게 되어 있을 경우, 이 DrawCall이 증가하게 된다. 게임에서 Draw Call을 확인하는 방법은 다음과 같다.Window – Analysis – Frame Debugger를 클릭하여 창을 활성화 한다.위와 같은 창이 나오는데 여기서 Enable을 클릭하면 다음과 같이 Draw Call이 나타난다.그러나 아쉽게도 이 Sprite Atlas는 3D Game에서는 큰 효과를 볼 수 없다. 사용자를 위한 HUD 렌더링에 조금이라도 도움을 주기 위해서는 사용할 수 있지만, 3D 오브젝트는 대부분 sprite를 사용하지 않기 때문이다.오버드로어느 프로그램이나 마찬가지겠지만, 보이지 않는 것을 렌더링하는 것은 자원의 소모를 심하게 합니다. 따라서 보이지 않는 항목에 대해서는 렌더링을 실시하지 않도록 해야 합니다. 위의 Sprite Atlas와 마찬가지로 2D 게임에서는 이를 편하게 처리할 수 있습니다. 단순해보이지않는객체의경우완전히지워버리면되기때문입니다.3D의 경우 LOD를 활용하면 조금은 편하게 처리할 수 있지만 이 LOD의 경우 적용된 에셋만 사용할 수 있다. Coroutine / Event유니티는 기본적으로 동작을 Update / Fixed Update / Late Update에 의해 처리하도록 하고 있다. 그러나, 이 Update는 모두 1프레임 사이에 발생하기 때문에 수초마다 처리해야 하는 로직의 경우 Update/Fixed Update/Late Update로 돌릴 때 불필요한 연산을 계속 반복하게 된다. 따라서, Coroutine을 이용하여 매 프레임 반복할 필요가 없는 로직을 처리하는 것이 좋다. Event에 등록하여 사용하는 것도 좋은 방법 중 하나이다. 특정 이벤트가 발생했을 때만 확인하면 되기 때문에 각 프레임 또는 초당 이 이벤트를 감시할 필요가 없게 되어 프로그램 동작 중 불필요한 연산을 최소화하게 된다. 이 Coroutine과 Event는 2D 뿐만 아니라 3D에서도 좋은 영향을 준다.2D에 대해서만 간단히 정리해 보았지만 앞으로 3D에 대해서도 정리를 해야 할 필요를 느꼈다. Sprite Atlas의 경우 3D에서 큰 영향은 없을 것이라고 어느 정도 알고 있었지만, 생각보다 성능에 좋은 영향을 주지 않았기 때문이다. 코드적으로 최적화를 시키는 방법은 어느 정도 알고는 있지만 LOD가 아닌 다른 방법으로 렌더링되는 화면의 최적화를 할 수 있는 방법이 있는지 좀 더 찾아본 뒤 정리를 해야 할 것 같다.

error: Content is protected !!