이 페이지에서 얻을 수 있는 정보 Unity에서 작업하는 모바일 게임 개발자를 위한 아트 에셋 최적화 팁입니다. 이 글은 두 개의 기사 모바일 게임용 아트 최적화에 대해 설명합니다.
그 밖의 많은 모바일 최적화 팁을 찾을 수 있습니다. 이 포괄적인 전자책 과 이 Unity 학습 과정 모바일 애플리케이션을 위한 3D 아트 최적화
모바일 플랫폼에서는 다각형과 정점 모두 계산 비용이 많이 듭니다. 애플리케이션의 시각적 품질에 실제로 기여하는 영역에 폴리곤을 배치하여 처리 예산을 낭비하지 않도록 하세요.
대부분의 모바일 디바이스의 작은 화면 크기와 애플리케이션의 3D 개체 위치로 인해 3D 개체의 작은 삼각형 디테일이 보이지 않을 수 있습니다. 즉, 눈에 보이지 않는 작은 디테일보다는 물체의 실루엣에 기여하는 큰 모양과 부분에 집중해야 합니다. 텍스처와 노멀 맵을 사용하여 세밀한 디테일을 표현하세요.
오브젝트가 원거리로 이동하면 레벨 오브 디테일 (LOD)을 조정하거나 더 단순한 머티리얼과 셰이더를 사용하여 더 단순한 메시를 사용하도록 전환하여 GPU 성능을 개선할 수 있습니다.
더 많은 LOD 준비 팁
- 평평한 영역에서는 더 많은 폴리곤을 제거하고, LOD가 낮은 오브젝트에는 삼각형의 밀도가 높은 영역을 사용하지 마세요.
- LOD는 셰이더 복잡도에도 적용할 수 있습니다. 셰이더와 머티리얼은 멀리 떨어져 있는 3D 오브젝트에 최적화할 수 있습니다. 예를 들어 오브젝트가 카메라에서 멀어질수록 사용하는 텍스처의 수를 줄일 수 있습니다.
- 각 LOD 레벨 사이의 트라이앵글 수를 50% 줄이는 것이 좋습니다.
- 카메라에서 다양한 거리에서 LOD가 어떻게 보이는지 확인합니다.
- 변형되거나 애니메이션이 적용되는 캐릭터와 오브젝트에는 깔끔한 토폴로지가 필수적입니다.
- 완벽한 토폴로지에 집착하지 마세요. 텍스처와 머티리얼을 적용한 후에는 플레이어나 최종 사용자에게 3D 모델의 와이어프레임이 표시되지 않습니다.
LOD를 사용하지 않는 경우
LOD가 모든 상황에 적합한 것은 아닙니다. 예를 들어 카메라 뷰와 오브젝트가 모두 정적이거나 오브젝트가 이미 낮은 폴리곤 수를 사용하고 있는 애플리케이션에서는 사용하지 않는 것이 좋습니다. LOD는 실시간으로 사용할 수 있도록 메시 데이터를 저장해야 하므로 메모리 오버헤드와 파일 크기가 커집니다.
여러 개의 메시를 하나로 결합하여 렌더링에 필요한 드로 콜 횟수를 줄일 수 있습니다. 이 기법을 적용하려면 계층구조에 빈 게임 오브젝트를 생성하여 결합하려는 메시의 부모로 만든 다음, 부모 게임 오브젝트에 Mesh.CombineMeshes( ) 메서드를 구현하는 스크립트를 첨부합니다.
오클루전 컬링 사용
다른 오브젝트 뒤에 숨겨진 오브젝트는 여전히 렌더링 및 리소스 비용이 발생할 수 있습니다. 오클루전 컬링을 사용하여 폐기합니다.
카메라 뷰 외부의 프러스텀 컬링은 자동이지만, 오클루전 컬링은 구워지는 프로세스입니다. 오브젝트를 스태틱 오클루더 또는 스태틱 오클루디로 표시한 다음 창 > 렌더링 > 오클루전 컬링 대화 상자를 통해 구우면 됩니다. 모든 장면에 컬링이 필요한 것은 아니지만 많은 경우 컬링을 통해 성능을 향상시킬 수 있습니다. 자세한 내용은 오클루전 컬링 작업 튜토리얼을 확인하세요.
다음은 모델을 가져올 때 염두에 두어야 할 몇 가지 유용한 팁입니다.
- 애니메이션 유형: 애니메이션 데이터가 포함되지 않은 FBX 메시를 임포트할 때는 임포트 세팅의 릭 탭에서 애니메이션 유형을 없음으로 설정합니다. 메시를 계층구조에 배치할 때 이 세팅을 사용하면 Unity에서 사용하지 않는 애니메이터 컴포넌트를 생성하지 않도록 합니다.
- 릭과 블렌드 셰이프를 비활성화합니다: 메시에서 스켈레탈 또는 블렌드셰이프 애니메이션이 필요하지 않은 경우, 가능하면 이 옵션을 비활성화하세요.
- 노멀과 탄젠트를 비활성화합니다: 메시 머티리얼에 노멀이나 탄젠트가 필요하지 않다고 확신하는 경우, 이 옵션을 선택 해제하면 비용을 추가로 절약할 수 있습니다.
- 임포트 설정 런타임에 모델을 수정하지 않는 경우 가져오기 설정의 모델 탭에서 읽기/쓰기 활성화 옵션을 비활성화하여 메모리에 사본이 생성되지 않도록 합니다.
- 정적/동적 일괄 처리: 스태틱 배칭은 드로우 호출 횟수를 줄이는 일반적인 최적화 기법입니다. 렌더링 중에 이동, 회전 또는 스케일링되지 않는 많은 수의 버텍스로 구성된 오브젝트에 이상적입니다. 대상 모델의 메시 렌더러가 포함된 인스펙터에서 스태틱을 확인합니다.
텍스처는 크기가 다를 수 있습니다. 디테일이 덜 필요한 텍스처의 크기를 줄이면 대역폭을 줄이는 데 도움이 됩니다. 예를 들어 디퓨즈 텍스처를 1024 x 1024로 설정하고 관련 러프니스/메탈릭 맵을 512 x 512로 설정할 수 있습니다. 텍스처 크기를 선택적으로 줄이고, 나중에 시각적 품질이 저하되지 않았는지 항상 확인하세요.
대부분의 텍스처링 소프트웨어는 sRGB 색 공간을 사용하여 텍스처를 작업하고 내보냅니다.
sRGB 색 공간에서 디퓨즈 텍스처를 사용하는 것이 좋습니다. 색상으로 처리되지 않는 텍스처는 sRGB 색상 공간에 속하지 않아야 합니다. 이러한 텍스처의 예로는 메탈릭, 러프니스, 노멀 맵 등이 있는데, 맵은 색이 아닌 데이터로 사용되기 때문입니다. 이러한 맵에서 sRGB를 사용하면 머티리얼에 잘못된 시각적 효과가 나타납니다.
참고: 인스펙터 창의 sRGB(색상 텍스처) 설정에서 러프니스, 스페큘러, 노멀 맵 또는 이와 유사한 항목 옆에 체크 표시가 없는지 확인합니다.
앰비언트 오클루전 및 작은 스페큘러 하이라이트와 같은 요소를 베이크한 다음 디퓨즈 텍스처에 추가할 수 있습니다. 이 접근 방식은 스페큘러 하이라이트와 앰비언트 오클루전을 얻기 위해 계산 비용이 많이 드는 셰이더와 Unity 기능에 지나치게 의존하지 않아도 된다는 의미입니다.
가능하면 셰이더에서 컬러 틴팅이 가능한 회색조 텍스처를 사용하세요. 이렇게 하면 텍스처 메모리를 절약할 수 있으므로 틴팅을 수행하기 위해 커스텀 셰이더를 만드는 데 드는 비용이 절감됩니다. 이 방법을 사용하면 모든 개체가 잘 보이는 것은 아니므로 이 기법을 선택적으로 사용해야 합니다. 색상이 균일한 개체에 적용하는 것이 더 쉽습니다.
텍스처 필터링은 씬의 텍스처 품질을 향상시키는 경우가 많지만, 더 나은 텍스처 품질을 얻으려면 더 많은 처리가 필요하므로 성능이 저하될 수도 있습니다. 텍스처 필터링은 때때로 GPU 에너지 소비의 최대 절반을 차지할 수 있습니다. 더 간단하고 적절한 텍스처 필터를 선택하면 애플리케이션의 에너지 수요를 줄이는 데 도움이 될 수 있습니다.
- 가장 가까운/포인트 필터링: 텍스처 필터링 중 가장 간단하고 계산 부담이 적은 형태이지만, 가까이서 보면 텍스처가 뭉툭하게 보일 수 있습니다.
- 이중선형 필터링: 텍스처의 컬러 픽셀에 인접한 텍셀을 샘플링하고 평균을 내는 선형 필터링입니다. 가장 가까운 필터링과 달리 이중 선형 필터링은 픽셀이 부드러운 그라데이션을 가지므로 픽셀이 덜 블록화됩니다. 바이리니어 필터링의 부작용은 텍스처를 가까이서 볼 때 흐릿하게 보인다는 것입니다.
대부분의 메모리는 텍스처에 사용되므로 여기서 임포트 설정이 중요합니다. 일반적으로 에셋을 가져올 때는 다음 가이드라인을 따르세요.
- 최대 크기를 낮춥니다: 시각적으로 허용되는 결과를 생성하는 최소 설정을 사용합니다. 이 방법은 비파괴적이며 텍스처 메모리를 빠르게 줄일 수 있습니다.
- 2의 거듭제곱(POT)을 사용합니다: Unity는 모바일 텍스처 압축 포맷(PVRCT 또는 ETC)에 POT 텍스처 치수를 요구합니다.
- 텍스처를 아틀라스합니다: 여러 텍스처를 하나의 텍스처에 배치하면 드로 콜을 줄이고 렌더링 속도를 높일 수 있습니다. Unity 스프라이트 아틀라스 또는 타사 텍스처팩터아틀라스를 사용하여 텍스처를 제작하세요.
- 읽기/쓰기 활성화 옵션을 끕니다: 이 옵션을 활성화하면 CPU 및 GPU 주소 지정이 가능한 메모리 모두에 사본을 생성하여 텍스처의 메모리 사용 공간을 두 배로 늘립니다. 대부분의 경우 이 기능을 비활성화한 상태로 유지합니다. 런타임에 텍스처를 생성하는 경우 Texture2D를 통해 이를 적용합니다. 를 적용하고 makeNoLongerReadable을 true로 설정합니다.
- 불필요한 밉맵을 비활성화합니다: 2D 스프라이트나 UI 그래픽처럼 화면에서 일정한 크기로 유지되는 텍스처에는 밉맵이 필요하지 않습니다. 카메라와의 거리가 다양한 3D 모델에 대해 밉맵을 활성화한 상태로 둡니다.
- 이중 선형 필터링을 사용합니다: 이렇게 하면 성능과 시각적 품질 간의 균형을 맞추는 데 도움이 됩니다.
- 삼선형 필터링을 선택적으로 사용합니다: 이선형 필터링보다 더 많은 메모리 대역폭이 필요합니다.
- 이선형 및 2배 이방성 필터링을 사용합니다: 삼선형 및 1배 이방성 대신 이를 선택하면 모양과 성능을 모두 개선할 수 있습니다.
- 이방성 레벨을 낮게 유지합니다: 중요한 게임 에셋에는 2보다 높은 레벨만 사용하세요.
iOS와 Android 모두에 적응형 확장 가능한 텍스처 압축(ATSC)을 사용합니다. 개발 중인 대부분의 게임은 ATSC 압축을 지원하는 최소 사양 기기를 대상으로 하는 경향이 있습니다. 유일한 예외는 다음과 같습니다:
- A7 디바이스 이하(예: iPhone 5, 5S 등)를 대상으로 하는 iOS 게임: PVRTC 사용
- 2016년 이전 기기를 대상으로 하는 Android 게임: 에릭슨 텍스처 압축(ETC2) 사용
텍스처 채널 패킹은 세 개의 맵을 하나의 텍스처로 가져올 수 있으므로 텍스처 메모리를 절약하는 데 도움이 됩니다. 즉, 텍스처 샘플러 수가 줄어든다는 뜻입니다. 이 접근 방식은 일반적으로 러프니스, 매끄러움 및/또는 메탈릭을 하나의 텍스처로 패킹하는 데 사용됩니다. 모든 텍스처 마스크에도 적용할 수 있습니다. 예를 들어 알파 마스크를 저장할 수도 있습니다. 투명도가 있는 이미지는 32비트 포맷이 필요하기 때문에 메모리 공간이 더 클 수 있지만, 무료 채널을 사용하여 알파 마스크를 저장하면 디퓨즈 텍스처를 16비트로 유지하여 파일 크기를 효과적으로 절반으로 줄일 수 있습니다.
녹색 채널을 사용하여 가장 중요한 마스크를 보관하세요. 우리 눈은 녹색에 더 민감하고 파란색에 덜 민감하기 때문에 일반적으로 녹색 채널에 더 많은 비트가 있습니다.
UV 맵은 3D 모델의 표면에 2D 텍스처를 투영합니다. UV 언래핑은 UV 맵을 생성하는 프로세스입니다.
- 포장되지 않은 텍스처의 개별 단위인 UV 섬을 최대한 똑바로 유지하여 UV 섬을 더 쉽게 포장하고 낭비되는 공간을 줄이는 것이 가장 좋습니다. 직선 UV는 텍스처의 계단 효과를 방지하는 데도 도움이 됩니다.
- 모바일 플랫폼에서는 텍스처 공간이 제한되어 있습니다. 따라서 텍스처 크기는 일반적으로 콘솔이나 PC보다 작습니다. UV 패킹을 잘하면 텍스처의 해상도를 최대한 활용할 수 있습니다.
- 텍스처 품질을 높이려면 UV를 똑바로 유지하여 약간 왜곡된 UV를 사용하는 것이 좋습니다.
- 경우에 따라 도형 가독성을 높이기 위해 가장자리와 음영을 과장하고 강조해야 할 수도 있습니다. 모바일 플랫폼은 일반적으로 작은 텍스처를 사용하기 때문에 그 작은 공간에서 필요한 모든 디테일을 캡처하기 어려울 수 있습니다.
- 모바일 애플리케이션의 경우 텍스처를 더 적게 사용하고 추가 디테일은 하나의 텍스처로 굽습니다. 일부 디테일은 디퓨즈 텍스처 자체에 구워야 작은 모바일 화면에서 디테일이 더 잘 보이기 때문에 이 작업이 중요합니다.