다음 권장사항을 따라 Android 게임에서 머티리얼과 셰이더 사용을 최적화하세요.
머티리얼과 셰이더는 최신 3D 아트의 핵심 구성 요소입니다. 많은 기기에서 원활하게 실행되는 3D 게임은 그래픽 프로세서를 최대한 활용할 수 있도록 디자인된 3D 아트에서 시작됩니다. 이 가이드에서는 게임의 성능을 개선하고 전력 소모를 최소화하기 위한 모바일에서의 머티리얼과 셰이더 최적화 및 권장사항을 중점적으로 설명합니다.
이 도움말의 일부는 Arm Limited에서 제공해 준 저작권 보호를 받는 내용을 기반으로 합니다.
게임 엔진 모바일 친화적 셰이더
게임 엔진은 머티리얼과 셰이더를 연결하는 방법이 다릅니다. Unity 엔진에서는 여러 셰이더를 만들 수 있지만 각 머티리얼에는 셰이더 하나만 할당할 수 있습니다. Unreal Engine 4에서는 타겟 플랫폼에 따라 머티리얼에 다양한 셰이더를 적용할 수 있습니다.
셰이더와 머티리얼의 정의는 아티스트를 위한 머티리얼과 셰이더 권장사항을 참고하세요.
Unity나 Unreal Engine 4와 같은 게임 엔진을 사용하는 경우 모바일 하드웨어용으로 설계된 내장 셰이더를 사용하세요. 이러한 셰이더에는 휴대기기에서의 성능 향상을 위한 간소화된 기능 구현이 포함되어 있습니다. 가능하면 머티리얼을 구성할 때 사용하지 않는 기능을 사용 중지합니다. 이러한 기능에는 색상 색조 조정이나 세부 맵 등이 있을 수 있습니다. 사용하지 않는 기능을 사용 중지하면 엔진이 최종 셰이더 프로그램에서 이러한 기능을 생략하여 성능을 높일 수 있습니다.
Unity
Unity에는 여러 렌더링 엔진이 포함되어 있습니다. 최신 모바일 게임에는 범용 렌더링 파이프라인(URP)이 가장 좋습니다. URP에는 타겟 플랫폼에 따라 복잡성이 자동으로 조정되는 표준 셰이더 세트가 포함되어 있습니다. 기존 Unity 렌더기에는 모바일 플랫폼용으로 설계된 셰이더 컬렉션이 포함되어 있습니다. 이러한 셰이더는 모바일 카테고리에 그룹화됩니다.
Unreal Engine 4
Unreal 엔진에서는 선택된 타겟 플랫폼에 따라 모바일 셰이더를 선택합니다. 모바일 셰이더의 시각적 출력은 기본 Shader Model 5 셰이더와 다를 수 있습니다. Unreal 편집기에서 미리보기 렌더링 수준을 변경하여 모바일 셰이더의 렌더링 출력을 시뮬레이션할 수 있습니다. 몇 가지 차이점에도 불구하고 Unreal에서는 모든 플랫폼의 머티리얼에 같은 프로세스를 사용하므로 모바일 셰이더의 시각적 요소와 동작이 기본 셰이더와 유사합니다.
텍스처 샘플러 최소화
휴대기기를 타겟팅하는 게임은 머티리얼에 가능한 가장 적은 텍스처를 사용해야 합니다. 추가된 각 텍스처에는 텍스처 샘플링이 추가로 필요하므로 메모리 대역폭이 소비되고 전력 소모가 증가합니다. Unreal Engine 4에서는 휴대기기에서 실행할 때 최대 5개의 머티리얼 텍스처를 권장합니다. 텍스처 샘플러 5개도 여러 기기에서 광범위하게 사용하기에는 상당히 비용이 많이 들 수 있습니다. 다음은 텍스처 샘플러 수를 최소화하는 전략입니다.
- 텍스처 패킹을 사용하여 단일 채널 텍스처를 결합합니다. 이 기법에 관한 자세한 내용은 텍스처 가이드를 참고하세요.
- 거칠기 또는 금속성과 같은 매개변수 데이터를 텍스처에서 읽는 대신 숫자 상수로 바꿉니다.
- 더 복잡한 조명 모델에서 조명 계산을 지원하는 데 필요한 텍스처를 생략할 수 있도록 언리트 셰이더나 간단한 조명 모델을 사용합니다.
가능하면 조명 사용 중지
리트와 언리트는 셰이더와 머티리얼의 공통적인 구분입니다. 실시간 조명에는 셰이더에서의 추가 계산이 포함됩니다. 구현되는 조명 시스템 유형에 따라 메모리 공간과 대역폭을 더 많이 사용하는 머티리얼 텍스처가 필요할 수 있습니다. 모바일 게임, 특히 성능이 낮은 하드웨어를 타겟팅하는 모바일 게임의 경우 실시간 조명 사용을 최소화하는 것이 최적의 성능을 달성하는 데 중요합니다. 양식화 또는 만화 같은 아트 등 실시간 조명 없이 잘 작동하는 디자인을 중심으로 아트 디렉션을 설계하는 것이 좋습니다.
투명도 사용 최소화
가능하면 불투명한 머티리얼을 사용하세요. 투명도가 있는 객체를 렌더링하는 것은 불투명한 같은 객체보다 항상 비용이 더 많이 듭니다. 모바일 그래픽 하드웨어의 디자인으로 인해 투명도를 렌더링하는 비용이 컴퓨터나 게임 콘솔 그래픽 하드웨어에서보다 상대적으로 더 높습니다. 게임에서 투명한 객체를 많이 그리면, 특히 서로 겹쳐서 렌더링될 때 성능에 부정적인 영향을 미칩니다.
같은 픽셀을 여러 번 그리는 것은 오버드로 문제라고 합니다. 여러 레이어의 투명도 오버드로를 피해야 합니다. 대부분의 게임에는 오버드로를 시각화하여 감지하고 제거할 수 있는 진단 도구가 있습니다. 이러한 도구를 사용하여 게임 성능을 개선하고 프레임 속도를 저하시키는 문제 영역을 식별합니다.
적절한 알파 방식 사용
투명도를 구현하는 가장 일반적인 방식은 알파 블렌딩과 알파 테스트입니다.
알파 테스트를 통해 객체 머티리얼이 100% 불투명하거나 100% 투명하게 보이게 됩니다. 이 컷오프의 알파 값 기준을 구성할 수 있습니다. Unity에서는 이 유형의 투명도를 Cutout이라고 합니다. Unreal Engine 4에서는 이를 Masked 혼합 모드라고 합니다.
알파 블렌딩을 사용하면 객체 머티리얼의 투명도를 다양하게 할 수 있고 객체를 부분적으로 투명하게 보이게 할 수 있습니다. Unity에서는 이 유형의 투명도를 Transparent라고 합니다. Unreal Engine 4에서는 이를 Translucent 혼합 모드라고 합니다.
알파 블렌딩을 사용하면 일반적으로 알파 테스트보다 시각적 모양이 더 뛰어납니다. 그러나 폴리지와 같은 특정 유형의 메시의 경우 알파 블렌딩은 이동 시 메시를 볼 때 이상하게 보일 수 있습니다. 이는 잘못된 순서로 렌더링되는 잎과 가지를 인식하기 때문입니다. 알파 테스트는 이러한 효과를 최소화하지만 잎과 가지에 앨리어싱과 날카로운 모서리가 증가합니다.
알파 블렌딩과 알파 테스트가 같은 메시를 렌더링하는 데는 시간이 다르게 걸릴 수 있습니다. 어느 모드에서든 시각적 출력이 허용되는 메시의 경우 한 방식이 다른 방식보다 더 잘 실행되는지 알아보기 위해 벤치마킹해야 합니다.
셰이더 복잡성 프로파일링
텍스처 샘플러, 조명, 투명도와 같은 렌더링 기능은 모두 셰이더 복잡성을 증가시키고 렌더링 성능을 저하시킵니다. 게임 엔진에 내장된 도구는 물론 외부 그래픽 도구를 사용하여 셰이더 복잡성을 평가할 수 있습니다.
Unreal Engine 4에는 장면에 있는 객체의 예상 비용을 제공하는 Shader Complexity 뷰 모드가 포함되어 있습니다.
Unreal의 Material Stats 기능을 사용하여 머티리얼을 만들 때 머티리얼 비용을 프로파일링할 수도 있습니다.
꼭짓점 셰이더에서 계산
일반적으로 셰이더 렌더링 계산은 꼭짓점 셰이더와 프래그먼트(픽셀이라고도 함) 셰이더 간에 분할됩니다. 렌더링되는 프래그먼트 수는 일반적으로 꼭짓점 수보다 많습니다. 꼭짓점 셰이더에서 비용이 많이 드는 계산이 실행될 수 있다면 프래그먼트 셰이더에서 발생하는 것보다 더 적게 실행됩니다.
그러나 이 데이터가 프래그먼트 셰이더에서 사용되면 꼭짓점 셰이더에서 전달되어야 합니다. 전달되는 데이터 양이 너무 많은 경우 프래그먼트 셰이더에서 계산을 실행하는 것이 더 높은 성능을 발휘할 수 있습니다. 타일러 사용률을 평가하는 프로파일링 도구를 사용하여 일련의 계산을 위한 최적의 셰이더 위치를 결정할 수 있습니다. Unreal Engine 4에는 이러한 프로파일링을 지원할 수 있는 맞춤설정된 UV 기능이 있습니다.
고비용의 수학 연산 피하기
수학 연산은 셰이더 프로그램에서 셰이더 출력의 동작과 모양을 제어하는 데 사용됩니다. 일반적인 연산으로는 기본 산술, 거듭제곱, 최저한도, 대수 등이 있습니다. 수학 연산은 계산 비용이 같지 않습니다. 비용이 많이 드는 연산으로 채워진 셰이더는 특히 이전 기기에서 더 느리게 작동합니다. 비교적 저렴한 연산의 예는 다음과 같습니다.
- 덧셈
- 뺄셈
- 곱셈
비용이 많이 드는 연산은 다음과 같습니다.
- 나눗셈
- 초월수(사인, 코사인, 거듭제곱, 대수, 탄젠트)
성능을 자주 프로파일링
성능 병목 현상을 항상 명확히 알 수 있는 것은 아닙니다. 문제 영역이 있는 위치를 추정하지 말고 프로파일링 도구를 사용하여 렌더링 성능을 평가합니다. 최적화로 테스트 전후에 실행하여 영향을 정확히 측정해야 합니다.