Unity/최적화 맨텀 2021. 7. 25. 18:06
유니티에서 모바일 텍스처 형식에 따른 용량과 품질을 알아보도록 하자. 결론부터 말하면, 안드로이드에서는 3D 게임이거나 팀내에 TA가 있다면 ETC2대신 ASTC를 고려하고, iOS에서는 PVRTC대신 ASTC를 사용하는 것을 추천한다. 무압축 RGBA 압축하지 않은경우 R, G, B, A 채널에 각 8비트를 사용하여 알파가 존재하는 경우 픽셀당 32비트, 알파가 없는 경우 픽셀당 24비트를 사용한다. 2048x2048 RGBA 이미지의 용량 : 2048 * 2048 * 32 = 134.217,728 (약 16MB) 2048x2048 RGB 이미지의 용량 : 2048 * 2048 * 24 = 100,663,296 (약 12MB) * 유니티는 텍스처를 자체적으로 한번 더 압축하기 때문에 원본 텍스쳐의 용량..
Unity/최적화 맨텀 2021. 7. 18. 21:41
스프라이트 아틀라스 드로우콜을 최적화 하기 위해서 작은 이미지들을 하나의 이미지로 모으는 기능이다. 유니티 내에 내장되어있으며, 손쉽게 적용 가능하다. 왜 하나로 모으는게 최적화라는 걸까? 두 가지 이유가 있다. 1. ETC, PVRTC 텍스쳐 포멧의 POT (Power of two) 문제 - ETC와 PVRTC 텍스쳐는 이미지의 사이즈가 2의 승수일 때만 압축이 가능하다. 2의 승수가 아니면 압축을 하지 못해 무압축 이미지가 되어버린다. 때문에 POT 사이즈의 틀 안에 작은 이미지들을 담아서 압축을 하는 것. - 아래는 그 예시이다. 609x1050 의 픽셀수가 훨씬 적은데도 1024x1024 이미지보다 용량을 2배이상 차지하는 것을 확인할 수 있다. (무압축 RGBA8이 사용된 것이 보인다.) - 최..
Unity/최적화 맨텀 2021. 7. 18. 21:11
2D 게임에서는 무엇을 최적화해야할까 3D 게임이라면 성능에 가장 영향을 미치는 부분이 정점의 갯수와 라이트 연산일 것이다. 하지만 2D 게임이라면 화면 해상도와 오버드로우가 가장 큰 영향을 미친다. (물론 3D도 동일하게 영향을 미친다) 화면의 해상도가 FHD(1920x1080) 일 때, 픽셀의 갯수는 약 200만개로, 이미지를 겹칠 때마다 그려야하는 픽셀 갯수가 곱해진다. 이를 오버드로우(Overdraw) 라고 한다. 아무래도 2D 게임에서는 이미지를 겹쳐서 표현해야하다보니 투명도 있는 이미지가 많아지게 되고, 오버드로우를 피할 수는 없다. 하지만 최대한 투명한 부분을 그리지 않도록 하여 오버드로우를 줄이는 방법이 존재한다. 오버드로우를 확인해보자 실험을 위해 유니티에서 아래와 같이 스프라이트 세개를..
Unity/최적화 맨텀 2021. 4. 28. 21:10
힙 메모리 영역 프로그램을 만들 때 힙 메모리 영역은 프로그래머가 항상 신경 써야 되는 중요한 메모리 영역이다. 유니티에서 힙 변수가 생성될 때 여유 메모리가 충분하지 않다면 가비지 컬렉션작업을 수행한다. 하지만 가비지 컬렉션 작업은 꽤나 무거운 작업이기 때문에 이 순간 프레임 드랍이 발생한다. 이를 개선하기 위해 최근에는 Inscremental GC 기능이 업데이트 되긴하였지만, 그래도 가비지 컬렉션의 대상이 되는 힙 할당을 최대한 만들지 않는 것이 좋다. 1. 자주 사용되는 참조 변수는 캐싱하기 다음의 코드는 함수를 호출할 때마다 새로운 힙 메모리 영역에 할당하게 되어 가비지가 발생한다. public void MyMethod() { Button btn = GetComponent(); // 함수 호출시..
Unity/최적화 맨텀 2021. 4. 27. 18:25
기본적인 내용들도 있지만, 상기시키자는 의미로 나열해보았다. 1. 처리에 부하를 주는 Unity API를 피하자 SendMessage() 리플렉션을 사용하기 때문에 비용이 크다. 가급적 Event와 Delegate를 사용하자. Find() 게임 월드 내의 모든 오브젝트를 탐색하기 때문에 프로젝트가 커지면 커질수록 비용이 크게 증가한다. Transform 트랜스폼을 변화시키면 해당 오브젝트의 모든 자식들에게 OnTransformChanged 이벤트가 전파된다. 여러 계산을 통해 트랜스폼을 변화시킨다면 따로 적용하지 말고, 모든 계산이 끝난 뒤 최종 값을 적용하자. 아래의 예는 SetPositionAndRotation을 통해 두 번의 트랜스폼 메시지를 한 번으로 최적화할 수 있다. // 트랜스폼이 두 번 변..
Unity/최적화 맨텀 2020. 8. 27. 17:11
animator나 material, shader의 parameter를 호출할 때, 간편하게 string형으로 호출하는 경우가 많다. animator.SetTrigger("Attack"); material.SetTexture("_MainMap", texture); shader.SetGlobalColor("_MainColor", color); 명시성도 좋고 간편하지만, 성능상으로는 매번 문자열에서 Hash로 변환하기때문에 성능상 좋지않다고한다. 아래와같이 멤버변수로 캐싱해놓고 쓰는 것을 추천한다. int id = Animator.StringToHash("Attack"); animator.SetTrigger(id); int id = Shader.PropertyToID("_MainMap"); material.S..