[펌] 유니티 최적화 : 아트 리소스 최적화 기법들
※ 본 문서는 NDC 2015 띵소프트의 이득규님의 강연을 바탕으로 정리한 문서입니다.
삼국지조조전 Online의 unity3D 아트 리소스 최적화 기법들 : 링크
Unity 성능개션옵션(출처불명인데 엄청 좋은내용) : 링크
게임 개발 포에버 : http://www.gamedevforever.com/333 / http://www.gamedevforever.com/332
1. 외국 시장의 용량과 메모리 문제
- WIFI가 원활하게 사용 가능한 나라는 생각보다 많지 않다. 게임의 용량이 진입장벽이 될 수 있다.
- 일부 중국 퍼블리셔는 200MB 초과게임은 심사거부
- 저가 안드로이드 폰의 저장용량 160MB~4GB에 불과함. (2015년 기준 안드로이드 ONE)
- 실제 가용 메모리는 256MB~400MB 정도라고 보면 된다.
결론 : 중국시장을 노린다면 200MB이내, 메모리 400MB 이내로 해결하자.
2. 최적화 요소 점검
- 유니티로 빌드할때 생성된 로그파일에서 용량별 퍼센트를 볼 수 있다. (콘솔 화면에서 open Editor Log)
- 용량이 큰 파일부터 최적화요소를 점검하자
3. 폴더 필더링
- 유니티는 Assets 폴더 내의 폴더명으로 빌드에 반드시 포함할 것을 구분한다. 폴더의 네이밍이 특히 중요하다.
폴더명 | 기능 |
Resources | - 여기에 들어있는 파일은 사용 여부와 무관하게 모두 빌드에 포함된다. |
Assets\ Editor Default Resources | - Resources와 유사하지만, 에디터에서만 접근 가능. - 편집엔 필요해도 빌드에 불필요한 아틀라스 원본텍스쳐나 에디터 리소스를 보관 |
Gizmos | - Gizmos.DrawIcon을 위한 아이콘과 텍스쳐 모음 폴더. 에디터 전용 폴더로 빌드 제외. |
.으로 시작하는 폴더 | - .으로 시작하는 폴더는 무시 |
Editor | - Unity Editor Scription API만 접근할 수 있는 폴더. - UnityEditor 네임 스페이스를 사용하는 스크립트는 이 폴더에 있어야 함. - 빌드에 포함되지 않고 에디터 상에서만 동작 - 동명의 폴더가 여기저기 있어도 모두 동일하게 동작 |
Standard Assets | - 이 폴더 하위의 스크립트는 최우선 컴파일 |
Plugins | - Native 플러그인은 이 폴더에 있어야 함 - 이 폴더의 파일은 모두 빌드에 포함 - 이 폴더 내의 스크립트는 먼저 컴파일 |
4. 텍스쳐 최적화
[ size ]
- 모바일에서 최대 사이즈는 4K를 지원하지만, 저가 안드로이드는 2K 까지 지원한다. 언제나 2K를 유지하자!
- 축소 시 원본 훼손이 안되도록 항상 2배 수로 축소
- 소스 자체는 언제나 크게만들고 유니티 자체로 크기를 축소하면 된다! 이 방법이면 고사양 버전 제작시 재작업 불필요
[ Alpha ]
- 알파를 쓰느니 폴리곤 갯수를 늘리는게 훨씬 좋다.
- ETC1 등을 사용할 경우 아티펙트로 경계 노이즈가 발생
[ Atlas ]
- 호출 빈도 등에 따라서 쓸모없는 메모리를 들고 있어야 하는 경우가 있다.
#. 유니티 Quality Setting에서 메모리상 텍스쳐 해상도를 전체 1/2로 하는 기능도 있다. 이를 기기 성능에 맞춰서 원활한 플레이를 하는 방법!
5. 소스 최적화
[ POT ]
- 가능한 모든 텍스쳐를 POT 규격으로 제작. POT가 불가능한 리소스는 텍스쳐 아틀라스로 패킹.
- NPOT 리소스는 압축 텍스쳐가 불가능하다 = 용량 증가
[ Alpha ]
- ETC1은 alpha가 없는 텍스쳐 포멧이다. 알파가 존재할경우 유니티는 RGBA16으로 변환한다.
- ETC1을 두 장 사용해서 alpha문제를 해결 (로딩빠르고, 용량적고, 메모리도 적게먹는다!)
- 하지만 쉐이더/로딩 코드를 수정해야 된다. 드로우 콜 증가. (직접 쉐이더 코드를 수정하지 못하면 사용 못함!)
6. 텍스쳐 포멧(유형)
[ 어떤 포멧으로 import 할까? ]
- 유니티 엔진은 어떤 텍스쳐라도 넣을 수 있고, 어떤 텍스쳐포멧을 넣던 유니티에서 한번 더 변환한다.
- PNG 압축사이트에서 압축해서 쓰세요! 이러는건 PNG를 유니티 변환하지않고 우회해서 사용할 때의 얘기다.
- 어차피 압축을 다시 하기때문에 무조건 가장 품질 좋은 것을 넣으면 된다! (프로젝트파일 용량걱정만 없다면!)
[ Format 설정 ]
- Format 쪽에 가보면 Compressed, 16 bits, Truecolor 3가지가 있다. 이 외의 것을 하면 안돌아가는 기기가 있다!
- 만약 사용자 앱이지원되지않는 텍스쳐압축을 사용할 경우 그 텍스쳐는 RGBA32무압축(엄청난용량!)으로 메모리손실
설정 값 | 설명 |
Compressed | 기본 설정 값. 압축효과 가성비 높음. 알파가 있을 때는 차라리 알파없는 텍스쳐 한장을 더 쓴다. |
16Bit | 압축하지 않고 색상만 줄어든다. TA가 없다면 사용하지 말 것. |
TrueColor | 압축을 전혀 하지않음. UI에만 사용해야한다. 알파가 있다면 어쩔 수 없는 선택. |
[ 세부 Format 설정]
- 알파 필요없는데 PNG등으로 들여오면 RGBA로 임포트가 되버린다.
- 아 물론 알파채널을 스펙큘러등으로 쓰는경우 (Toony Pro의 스펙큘러 등)은 그냥 RGBA로 써야된다!
- Texture가 아니라 Advanced를 선택하면 세부 설정을 지정할 수 있다.
종류 | 사용해야하는 포멧 |
POT전용 - 직사각형O | RGB Compressed ETC 4 bits |
POT전용 - 직사각형O | RGB Compressed PVRTC 2 bits RGBA Compressed PVRTC 2 bits RGB Compressed PVRTC 4 bits RGBA Compressed PVRTC 4 bits |
NPOT | RGB 16 bit RGB 24 bit RGBA 16 bit RGBA 32 bit |
- Texture가 아니라 Advanced로 선택한 뒤, RGB Compressed ETC 4 bits를 선택하자. ( 무려 2배차이 ! )
- Quality는 100으로 하면 약간의 딜레이가 발생하지만 더 품질이 손상없어짐!
[ 결론 ]
- 알파가 없다면 일단 Compressed를 사용하자!
- 알파가 존재하는 UI라면 TrueColor를, 그 외의 것이라면 차라리 알파 없는 것을 하나 더 써서 마스킹을 하시길.
7. UGUI 최적화
[ Draw Call ]
- 유니티 UI의 드로우 콜은 캔버스 단위로 이루어진다.
- 하나의 캔버스 하위에 쓰이는 이미지들이 Sprite Packing이 되어있다면, 모두 하나의 드로우콜로 처리가 가능하다.
- 동적으로 반응하는 버튼이나 Fill Image를 처리할 때 매번 갱신비용이 발생하기 때문에, UI요소들을 하나의 Canvas에 몰아넣는 것만이 좋은 것이 아니다.
[ Text ]
- 텍스트는 Font 종류당 하나씩 드로우 콜이 발생한다.
8. FBX 최적화
[ Model ]
- Mesh Compression은 기본적으로 꺼져있는 상태지만, 모양이 뭉개지지 않는 범위내에서 최대값을 선택한다.
(왼쪽이 OFF, 오른쪽이 High 상태인데... 사실 뭔가 인지못할정도로! 바뀐다)
- Materials의 Import Material은 체크해제한다.
[ Animations ]
- 애니메이션이 포함되어 있지 않다면 체크해제한다.
9. 사운드 최적화
- 사운드는 디폴드 값으로 3D 스테레오 사운드로 설정되는데, 사실 모바일 게임에서는 스테레오는 의미없음.
- Force to Mono를 체크함
- Load Type은 메모리에 영향을 주는데 사운드 유형에 따라서 설정한다.
유형 | 사용처 |
Decompress on load | 짧은 효과음 |
Compressed in memory | 성우 대사 정도의 음성 |
Stream | 계속 플레이되는 긴 배경음악 |
'Unity3D > Tips' 카테고리의 다른 글
[펌] Audio Clip (0) | 2016.09.07 |
---|---|
[펌] 유니티 프로그래머가 알아야 할 최적화 스크립트 코드 작성법 (0) | 2016.08.30 |
[링크] APK용량 줄이기, 이미지 압축 (0) | 2016.08.09 |
[펌] BPM 계산 방식과 배속의 구현 방법 (0) | 2016.07.30 |
[펌] Unity3d 텍스쳐 압축 플러그인 ChromaPack (2) | 2016.07.04 |