-
[Memo] 최적화 ABCUnity/3D 2020. 5. 8. 23:12
최적화는 크게 3단계에서 봐야할 것 같다.
(1) Baked: 미리 준비되어야 할 것들이 잘 구워졌는가?(2) 용량: 지나치게 용량이 큰 파일이 없는가
(3) Tris & Verts : 삼각형과 꼭지점, 즉, 메쉬(Mesh)를 너무 많이 부른 것은 아닌가?
(1)-1) 라이트맵
라이트맵(Light Map)은 정적(Static) 광원이 정적(Static) 오브젝트(Objects)에게 어떻게 빛을 비추는지 미리 계산해서 텍스처(Textures)로 만드는 것이다. 왜 광원을 미리 저장해서 하냐면, 동적 광원의 경우 Tris & Verts 값을 뻥튀기 시키기 때문이다. 가령 배경 포함해서 tris가 10만인 맵에 동적 광원 하나 쏴주면, tris가 20만까지 치솟는다.
https://docs.unity3d.com/kr/current/Manual/Lightmapping.html
- 라이트 프로브(Light Probes) & 리플렉션 프로브(Reflection Probes)
다만 정적 광원이 동적 오브젝트에 아무런 영향을 못준다면 굉장한 어색함을 느낄 것이다. 그것을 방지 하기 위해 정점(probe)를 기준으로 각 방향에서 들어오는 빛과 반사를 미리 저장 해놓고, 동적 오브젝트들이 근처에 왔을 때 가까운 프로브들의 값을 참조하여 광원효과를 낸다.
https://docs.unity3d.com/kr/current/Manual/LightProbes.htmlhttps://docs.unity3d.com/kr/current/Manual/ReflectionProbes.html
(2)-1) 빌드 용량 확인: 텍스처
빌드를 하게되면 각각의 파일이 얼마나 용량을 차지하는지 확인을 할 수 있다. 콘솔 탭에서 우클릭하여 Open Editor Log를 클릭한다.
Used Assets and files from the Resources folder, sorted by uncompressed size: 13.0 mb 1.7% Resources/unity_builtin_extra 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/VolleyballNet01ColumnOld_Metallic.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportVaultingHorse02Old_Metallic.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportVaultingHorse01Old_Metallic.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportBasketHoop01Old_Metallic.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/VolleyballNet01ColumnOld_NM.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportVaultingHorse02Old_NM.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportVaultingHorse01Old_NM.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportTrampline01Old_Metallic.png 5.3 mb 0.7% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportMattress01Old_Metallic.png
대충 다음과 같은 로그를 찾을 수 있다. 위는 최적화 전의 용량으로 각각의 텍스처 이미지가 5.3mb를 차지함을 알 수 있다. 모든 텍스처를 고해상도(2048)로 써서 유저에게 미려한 그래픽을 보여주면 얼마나 좋겠냐만은... 현실적으로 그러는 것은 무리가 있기 때문에 이를 적정하게 줄여주어야 한다.
2048에서 1024로 줄어든다면, 용량은 4분의 1로 줄어든다. 512면 16분의 1로 줄어드는 셈.341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/VolleyballNet01ColumnOld_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportVaultingHorse02Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportVaultingHorse01Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportBasketHoop01Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Textures/Surfaces/Tile/TileArmstrong01_04OldSpec.tga 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportTrampline01Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/SportMattress01Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Sport/Textures/PingPongTable01Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/Furniture/Textures/SchoolLocker01Old_Metallic.png 341.5 kb 0.0% Assets/TirgamesAssets/SchoolScene/Models/Interior/BathToilet/Textures/ToiletCabinet01Old_Metallic.png
이것만으로도 빌드 후 용량을 780메가에서 160메가로 대폭 줄였다. 물론 막무가내로 줄일 수는 없고, 비교적 안 중요한 오브젝트 위주로 텍스처를 팍팍 줄여주자.
(2)-2) 빌드 용량 확인: 셰이더(Shader)
https://docs.unity3d.com/kr/2018.4/Manual/OptimizingGraphicsPerformance.html
Shader Variants가 지나치게 많이 만들어지지 않는지 확인한다. 솔직히 이부분은 좀 더 공부가 필요할 것 같다. Mtoon 쉐이더의 경우, 막무가내로 모든 조합을 컴파일해 무려 2500개가 넘는 Shader Variants를 생성했었는데, 몇몇 설정을 조절해줌으로써 74개로 극적으로 줄였다. 물론 여전히 많다고 생각하지만...
조정 전의 셰이더 용량 (142.7mb)
Build Report Uncompressed usage by category (Percentages based on user generated assets only): Textures 64.8 mb 21.0% Meshes 16.3 mb 5.3% Animations 6.1 mb 2.0% Sounds 628.2 kb 0.2% Shaders 142.7 mb 46.3% Other Assets 7.2 mb 2.3% Levels 7.6 mb 2.5% Scripts 1.5 mb 0.5% Included DLLs 13.3 mb 4.3% File headers 48.1 mb 15.6% Total User Assets 308.4 mb 100.0% Complete build size 665.0 mb Used Assets and files from the Resources folder, sorted by uncompressed size: 102.5 mb 15.4% Resources/unity_builtin_extra 39.1 mb 5.9% Assets/VRM/MToon/MToon/Resources/Shaders/MToon.shader 3.8 mb 0.6% Assets/TirgamesAssets/SchoolScene/Scenes/SchoolSceneAssets/SchoolTerrainAbandoned.asset
조정 후의 셰이더 용량 (48.1mb)Build Report Uncompressed usage by category (Percentages based on user generated assets only): Textures 64.8 mb 30.3% Meshes 16.3 mb 7.6% Animations 6.1 mb 2.9% Sounds 628.2 kb 0.3% Shaders 48.1 mb 22.5% Other Assets 7.2 mb 3.4% Levels 7.6 mb 3.6% Scripts 1.5 mb 0.7% Included DLLs 13.3 mb 6.2% File headers 48.1 mb 22.5% Total User Assets 213.8 mb 100.0% Complete build size 479.3 mb Used Assets and files from the Resources folder, sorted by uncompressed size: 46.8 mb 9.8% Resources/unity_builtin_extra 3.8 mb 0.8% Assets/TirgamesAssets/SchoolScene/Scenes/SchoolSceneAssets/SchoolTerrainAbandoned.asset ... 597.5 kb 0.1% Assets/VRM/MToon/MToon/Resources/Shaders/MToon.shader
모바일의 경우, standard 대신에 mobile이나 unlit 카테고리에서 셰이더를 선택하는 것도 하나의 방법인 듯하다.(3)-1) tris & verts 최적화: 폴리곤 줄이기
지나치게 많은 폴리곤을 가지고 있는 모델은 폴리곤 수를 줄인다. 유니티 Free Asset 중에 Mesh Optimizer가 있다. 나름 쓸만하다.
https://assetstore.unity.com/packages/tools/modeling/mesh-optimizer-154517
(3)-2) Terrain Trees & Details
나무와 잔디 같은 악세사리가 생각보다 Draw Call을 많이 야기하는 경우가 있다. 모바일 환경에서는 함부로 쓰기 어려운 녀석인 듯하다.
(3)-3) Occlusion 사용하기
(3)-4) Mesh Combine 사용하기
동일한 머테리얼을 사용하는 메쉬는 메시 컴바인 기능을 사용해서 하나의 메시처럼 활용할 수 있다. 드로우콜을 확 줄여준다고 한다.
(3)-5) LOD 사용하기거리에 따라 보여주는 것을 달리한다. 가령 멀리 있을 땐 골대 그물은 안보여 주다가 가까이 다가가면 보여주는 방식으로 조절을 할 수 있다.
'Unity > 3D' 카테고리의 다른 글
[Tip] Vroid 와 Unity의 연동 (0) 2020.04.28