유니티 텍스처

반응형

원본 글 : Unity Texture compression and optimization

개인 필요에 의해 발번역한 글 입니다.

원문을 보시길 강력 추천합니다.


유니티 게임을 만들 때 어느 텍스처 압축 포맷이 가장 좋은지 일반적으로 궁금해 한다.

일반적인 기준은 "디스크에서의 크기, 차지하는 메모리, 퍼포먼스"다.

유니티 엔진은 많은 옵션을 가지고 있다 : ETC1, ETC2, DXT3, DXT5, 기타등등.

어떻게 선택해야 할까?

다른 사람들이 어떻게 포맷을 선택하는지 알기 위해 최적화 트릭에 대해 간단히 알아보자.


첫번째로 "텍스처가 GPU에서 얼마만큼의 메모리를 가질까?"를 이해해야 한다.

- 근래의 많은 엔진들은 텍스처를 메모리에 있는 것과 같은 포맷으로 디스크에 저장하여,

  텍스처가 필요로 하는 메모리와 같은 크기의 파일로 만든다.

- 비압축 256x256 크기의 이미지는 256KB. 256x256크기의 DXT1 이미지는 32KB. DXT3 또는 DXT5는 64KB.

- "안드로이드 환경에서 어떻게 PNG를 GPU 텍스처로 옮기는가" 이 글을 보면

   왜 png 텍스처를 사용하고 싶지 않은지에 대해 설명이 되어 있다.

   대신 png들을 ext1, pvr 또는 etc로 export한다.


"하드웨어 압축을 사용하는 효율적인 게임 텍스처"는 apk용량과 게임의 로딩시간을 줄이기 위해

gpu에서 지원하는 사용할 만한 압축 포맷을 검사한다.

- 위의 링크에서 볼 수 알 수 있듯이, 상위버전의 OpengGL을 지원하면  더 나은 포맷을 사용할 수 있다.

  ETC1을 대체하기 위해 고품질과 알파채널을 지원하는 고유 포멧이 있다, 

  아래 내용을 참조해라.

   . ATC는 Adreno GPU에서 사용가능 하다.

   . PVRTC는 PowerVR GPU에서 사용가능 하다.

   . DXT1 S3 DXT1 텍스처 압축. Nvidia Tegra 플랫폼에서 실행된다.

   . S3TC S3 텍스처 압축, 일반적인 DXT 변형. Nvidia Tegra 플랫폼에서 실행된다.

- 게임에서 하드웨어 가속을 받는 텍스처를 사용하면 apk, 런타임 메모리 사용 및 로딩시간을 줄일 수 있다.


"유니티 2D 텍스처 최적화"는 메모리 절약을 위해 논리적 그룹 대신 유형별 텍스처로 그룹화하는 방법에 대해 설명한다.

- 위 링크에서 보면 2048 x 2048 텍스처가 압축을 했음에도 Texture2D 메모리에서 4MB나 차지한다.

- 에셋이 렌더링되지 않고 검은색 모양으로 보인다면 디바이스의 텍스처 메모리 한계를 넘어 선 것이므로 최적화를 해야한다.

- 스프라이트 시트의 세가지 압축 타입 유형 : Solids(입체), Fades(알파 블렌딩), 그리고 Alpha punchouts(알파 테스트).

- Solid는 알파가 없는 사각형 에셋이기에, 알파를 지원하지 않는 4비트 압축을 선택하여 많은 절약을 할 수 있다.

- Alpha Punchouts는 알파값을 사용하는 사각형 이외의 모양이며, 이미지 값은 알파값이 100% 또는 0%이다.

  이 타입이서는 5bit 압축을 선택한다.

- Fades는 가변도의 알파값을 사용하는 가장 복잡한 오브젝트에 사용한다.

  이 타입은 최소한으로 사용하고 깔끔하게 잘 보이도록 최소 8bit RGBA를 사용한다.


"ECT1 vs ECT2 vs DXT5" 어느 텍스처가 가장 좋은지에 대한 논의"

- ECT2는 ES3.0을 지원하는 디바이스에서만 가능하다

- 하지만 만약 2015년형 모든 디바이스가 타겟이라면 ECT2나 DXT5 둘 다 지원하기 때문에  

  텍스처를 선택하는데 그다지 문제가 되지 않는다. ARGB에 적합한 것을 고르고 나서

  RGB에는 그냥 ETC1을 사용하면 된다.

- 대부분의 디바이스는 ETC1을 지원한다. (Texture compression support)

- 이번 주말에 ETC1 + DXT5 조합으로 바꾼 덕분에 나의 파일 용량을 25프로 줄였다.


"Android Texture Compression - a comparison study with code sample"는 

안드로이드 디바이스에서 다른 포맷(png, etc, etc2, pvrtc, s3tc..)의 용량, 퀄리티를 비교한다.


"안드로이드에서 기본 텍스처 압축 포맷으로의 ETC2"에서는 ETC2 포맷의 사용에 대해 논의한다.

- apk 파일의 용량을 줄이기 위해 DXT5를 사용한다. 만약 디바이스에서 네가 설정한 텍스처 타입을 

  지원하지 않는다면 유니티는 소프트웨어 압축해제를 사용하여 32bit RGBA 텍스처로 로드한다.

- 메모리를 절약하기 위해 ETC2를 사용한다. 만약 낮은 스펙의 디바이스에서 ETC2를 지원하지 않는다면

  ETC2를 선택하는 것은 좋지 않을 것이다.

  Unity Packer를 사용하는 대신 이미지들을 패킹하는 추가 이유는, 스스로 디더링을 할 수 있기 때문이다.


몇몇의 텍스처에서 추천하는 최적화

- 2D를 위해 밉맵을 사용하지 않는다. "스프라이트에서 밉맵을 켜는게 가능한가?

- 텍스처를 DXT1 또는 DXT5로 압축한다. "메모리 최적화 기술"

- "어느 해상도로 스프라이트를 그려야 하는가?" 2048x2048은 이미 모바일 디바이스에서 좀 큰거 같다.


"어떻게 ETC1 압축에 알파를 더할 수 있을까?" ETC1 + Alpha 채널에 대한 질문에 대답 시도.

- packing tag로 지정하여 일부 아틀라스에 배치된 스프라이트.

- ETC1 압축 사용 체크박스를 체크했는지 뿐 아니라 안드로이드 오버라이드 체크박스까지 체크.

  유니티는 결과 아틀라스를 알파없는 두 개의 텍스처로 분리한 다음 렌더 파이프라인의

   마지막 단계에서 결합한다.

- 유니티 5.3.0과 그 이전버전들에서의 UI 셰이더는 ETC1+ Alpha를 지원하지 않았다.

- UI 요소들은 ETC1과 잘 맞지 않는다. 이에 대한 버그가 있다.


"유니티 모바일 알파분리". 이 블로그는 ETC1+Alpha 문제를 해결했고

안드로이드와 IOS 디바이스 모두에 대한 해결책을 제공했다.

(대략적으로 보면 결론적으로 텍스처를 두장 쓴다는 말,

현재 내가 참여하고 있는 프로젝트에서도 이 방법을 사용하고 있고 

rgba32텍스처를 자동으로 변환해 주는 시스템을 만들었다.

아래 링크(rgba32 bit texture를 etc 4bit texture 2장으로 사용하기)를 참조하면 된다.)


ETC1과 알파채널 알파분리

https://github.com/keijiro/unity-alphamask

결국, 어찌됐든 ETC + 알파채널을 사용하는게 대부분의 경우 합리적인 품질로

최적의 빌드크기와 메모리 공간을 제공하니 이걸 사용하자.


Reference Link

- Unity Texture compression and optimization

- S3의 S3TC대 3Dfx의 FXT1

- 모바일 게임 최적화의 정석, 텍스처 압축 편

- unity 2d texture optimization

- Texture compression support

- Android Texture Compression - a comparision study with code sample

- ETC2 as default texture compression on Android

- Is it possible to turn on Mip Maps for a sprite?

- Memory optimization tricks

- What Resolution should I be painting sprites in?

- How Can I Add Alpha To ETC1 Compression?

- ETC1 + Alpha Feature

- Unity mobile Splitalpha

- 유니티 최적화 기법 - 텍스처 편

- PVRTC - the most efficient texture compression standard for mobile graphics world

- Tiling와 Offset을 활용한 2개의 압축텍스처 최적화

- rgba32 bit texture를 etc 4bit texture 2장으로 사용하기

- 모바일 게임 최적화의 정석 - 텍스처 압축 편

-


'Optimizing > Unity' 카테고리의 다른 글

Mesh 최적화  (0) 2017.04.11
Dynamic Batching이 효율적일까?  (0) 2017.03.31
animation 최적화  (0) 2017.03.04
유니티에서의 메모리 관리.  (0) 2017.01.13
Unity sound setting  (0) 2017.01.10
TAGS.

Comments