모바일기기는 스로틀링때문에 100%의 성능을 사용하면 안됩니다.
-
해상도, 프레임 줄이기 (가장 편하고 확실한 방법, 해상도가 절반이면 연산량 1/4)
-
연산자 최소화하기 (벡터 연산 이전에 스칼라 연산먼저 처리해 최소화하기)
- 예 : vec4vec4floatfloat → floatfloatvec4vec4
-
분기 최소화 하기 (낮은 성능 순 번호)
- 상수분기 (컴파일 타임)
- 균일한 변수 분기
- 셰이더 내부에서 계산 된 값에 분기 (언리얼에서도 사용한다는데 얼마나 느린지 시험하면서 써야함)
- clip(), discard, AlphaCutoff 사용시 모바일에서 if로 컴파일됨
-
셰이더에서 배열의 인덱스 계산 안하기 (랜덤 배열에 접근하는 것이 비용이 더 많이듦)
-
동적 텍스처 조회 (GLES 3.0 에선 괜찮다는데 테스트 해봐야함)
- 픽셀 셰이더에 전달된 uv를 그대로 안쓰고 계산해서 사용시 느림
- 여러 텍스처 좌표세트를 매개변수에 패킹하고 swizzle으로 사용시에도 발생
-
Early Z (모바일에서 이점이 있나, MSAA 쓰려면 필수일듯)
- 하드웨어에서 자동으로 처리
- discard가 사용되는 Alpha Test는 비활성화된다. PS에서 버려지는데 write할 수 있어서
- PS에서 depth값을 write하려하면 비활성화된다.
-
텍스처 샘플링 성능
Documentation - Arm Developer
- Nearest 샘플과 이중선형 필터링, LINEAR_MIPMAP_NEAREST 이 최고의 퍼포먼스
- 삼선형이나 3D, 높은 정밀도 텍스처는 비용이 큼
-
오버드로 줄이기