Unity

[Unity] Unity 최적화 공부(3)

날아가는기억잡기 2021. 5. 13. 00:29

GPU Profiling

 GPU는 일부 플랫일부 플랫폼에서만 프로파일링이 가능하므로 GPU를 프로파일링하기 어렵다. 특히 대부분의 모바일 플랫폼에서는 Unity Profiler에 있는 GPU Usage를 사용할 수 없다. 따라서 모바일에서 GPU를 프로파일링할 때는 Bandwidth를 제공해주는 툴을 사용하거나 SnapDragon이나 Xcode같은 툴들을 사용하는 수밖에 없다.

Fillrate

의미: GPU가 1 초에 픽셀에 매핑 할 수있는 텍스처 맵 요소의 수를 의미

Fillrate = (화면의 픽셀) x (프래그먼트쉐이더 복잡도) x (오버드로우)

요즘은 모바일 기기의 해상도가 높다보니 Fillrate가 부하되는 경우가 많다. PlayerSetting > Resolution Scaling의 Target DPI(한 공간에 얼마만큼의 픽셀이 들어가나, 해상도 줄이기)를 줄여가면서 성능을 측정하면 Fillrate가 병목인지 아닌지 유추 가능하다.

Overdraw

오버드로우란, 픽셀을 덫그리는 것을 의미한다. 불투명 오브젝트인 경우 픽셀을 덫그리는 경우가 없다. 그러나 투명 오브젝트의 경우 중첩하는 픽셀들이 존재할 수 밖에 없다. 오버드로우에서 병목이 일어나는 경우는 대부분 Effect에서 일어난다. Effect 같은 경우는 수많은 particle을 사용하기 때문에 많이 중첩되어 사용된다. 이펙트를 실행할 때, 밝게 나타날수록 오버드로우가 많이 발생하였다는 의미이다.

업스케일 샘플링(Upscaling Sampling)

 업스케일 샘플링이란 GUI 해상도는 그대로 두고 인게임 렌더 텍스쳐의 해상도를 줄여 최적화를 하되 유저로 하여금 해상도에 변함이 없는 것처럼 보이게 하는 일종의 트릭이다. 이는 아래 깃헙에서 데모 프로젝트를 받을 수 있다.

https://github.com/ozlael/UpsamplingRenderingDemo

 

ozlael/UpsamplingRenderingDemo

Upsampling Rendering is old school but common trick for low end devices. - ozlael/UpsamplingRenderingDemo

github.com

 일반 Unity 3D는 해상도를 줄여주는 기능이 없지만 URP(Universal Renderer Pipeline)은 Render Scale을 줄여 이를 바로 적용 가능하다.

텍스처 압축

 PNG나 JPG같은 포맷은 GPU가 사용하기 위한 포맷이 아니라 용량을 아끼기 위한 포맷이다. 그렇기 때문에 GPU가 사용하기 위한 포맷(ETC, PVRTC)으로 바꾸어 줘야 한다. 즉, 리소스 자체의 원본 포맷이 뭐든 상관 없다. 단지 텍스쳐 세팅만 잘해주면 된다.

PVRTC

 PVRTC는 iPhone에서 주로 사용하는 포맷으로 4비트모드와 2비트 모드가 있다. 이는 픽셀 당 4비트로 사용할건지 2비트로 사용할건지 여부이다. 원래 이미지를 4개의 블럭 단위로 줄여가지고 해상도를 줄여서 2개의 대표 색상을 뽑아낸다. 그리고 Modulation Data를 조합해서 최종결과물을 GPU에서 디코딩한다. 다만 해상도를 줄여서 사용하기 때문에 Blooding(색번짐) 현상이 발생한다. 따라서 레트로 게임(도트 그래픽)에는 권장하지 않는다.

ETC

 PVRTC와 마찬가지로 블럭 기반으로 작업을 한다. ETC는 색상과 밝기로 이미지를 나누어 색상을 낮은 해상도로 뽑고 밝기를 조합해서 GPU에서 디코딩한다. 이는 색상이 번진다기보다는 블럭단위로 쪼개어지는 것을 볼 수 있다. ETC1이 ETC2보다 blocking 현상이 더 많다. 이는 4 x 4로 만들기 때문에 POT(2^n)으로 텍스쳐 사이즈를 만들어야 한다. 만약 POT로 만들지 않는다면 Unity 상에서 남는 공간을 알아서 빈공간으로 처리한다.

ASTC

 Adaptive Scalable Texture Compression의 약자로, 가변형으로 적용 가능한 텍스쳐 포맷이다. 이는 꼭 4 x 4 크기가 아니어도 텍스쳐를 만들 수 있다. 이 크기는 한 픽셀 당 어느 정도의 면적에 할당할 것인지를 의미한다. 즉, 한 픽셀 당 좁은 면적을 할당하면 그만큼 퀄리티가 올라갈 것이다. 따라서, 고해상도를 요하는 텍스쳐에는 4x4를 이펙트같이 저해상도여도 괜찮은 텍스쳐에는 12x12를 할당할 것이다.

 

www.youtube.com/watch?v=3-ir52a_ynM
www.youtube.com/watch?v=3_pASBWPovc