플랫폼마다 퍼포먼스의 편차는 큽니다. 고사양 PC GPU는 저가형 모바일 GPU보다 훨씬 더 많은 그래픽스 및 셰이더를 처리할 수 있습니다. 이는 단일 플랫폼에서도 똑같습니다. 빠른 GPU는 느린 내장 GPU보다 몇십 배 빠릅니다.
모바일 플랫폼과 저가형 PC에서 GPU 퍼포먼스는 개발에 사용한 컴퓨터에 비해 훨씬 느립니다. 저가형 GPU 컴퓨터에서 두루 좋은 퍼포먼스를 내기 위해 계산을 줄이고 텍스처 로딩을 줄이려면 수동으로 셰이더를 최적화를 하도록 권장합니다. 예를 들어 일부 빌트인 셰이더 오브젝트의 “모바일” 버전은 훨씬 빠르지만 일부 제약 사항이 있고 정확도가 떨어집니다.
이 페이지에는 런타임 성능에 대해 셰이더를 최적화하는 데 대한 정보가 포함되어 있습니다.
셰이더 코드가 수행해야 하는 연산과 프로세스가 많을수록 게임의 성능에 더 많은 영향을 끼칩니다. 예를 들어, 컬러당 머티리얼을 지원하면 셰이더가 더 유연해질 수는 있겠지만 해당 컬러가 흰색으로 설정된 상태로 유지될 경우 화면에 렌더링되는 버텍스 또는 픽셀마다 불필요한 연산이 수행됩니다.
계산의 빈도도 게임의 성능에 영향을 끼칩니다. 보통 버텍스(버텍스 셰이더 실행) 수에 비해 훨씬 많은 픽셀이 렌더링되고(픽셀 셰이더 실행도 많으며) 오브젝트보다 많은 버텍스가 렌더링됩니다. 가능하다면 계산을 픽셀 셰이더 코드에서 버텍스 셰이더 코드로 옮기거나 셰이더에서 완전히 없애고 스크립트에 값을 설정해야 합니다.
셰이더를 Cg/HLSL로 작성할 경우 float
, half
, fixed
의 3가지 기본 숫자 타입이 있습니다. 데이터 타입 및 정밀도 페이지를 참조하십시오.
성능을 위해서는 가능한 한 가장 낮은 정밀도를 사용합니다. 이러한 방법은 특히 저사양 하드웨어에 중요하며, 다음을 추천합니다.
float
정밀도를 사용해야 합니다.half
정밀도로 시작합니다. 필요한 경우에만 정밀도를 높입니다.fixed
정밀도를 사용합니다.실제로는 정확히 어떤 숫자 타입을 사용할 것이냐는 플랫폼과 GPU에 따라서 달라집니다. 일반적으로는 다음과 같습니다.
float
정밀도로 모든 계산을 수행하며 그 결과 float/half/fixed
는 결국 실질적으로 동일해집니다. 따라서 테스트가 다소 힘들 수 있는데 PC에서는 float/half/fixed 정밀도가 정말 충분한지 알기 어렵기 때문입니다. 정확한 결과를 위해서는 언제나 타겟 디바이스에서 셰이더를 테스트해야 합니다.half
정밀도를 지원합니다. 이를 통해 일반적인 경우 더 빠르고 더 적은 전력을 사용하여 계산을 수행합니다.Fixed
정밀도는 일반적으로 구형 모바일 GPU에서만 유용합니다. 대부분의(OpenGL ES 3 또는 Metal을 지원하는) 최신 GPU는 내부적으로 fixed
와 half
정밀도를 완전히 동일하게 다룹니다.자세한 내용은 데이터 타입 및 정밀도를 참조하십시오.
초월 함수(pow
, exp
, log
, cos
,
sin
, tan
등)는 리소스를 꽤 많이 사용하므로 저사양 하드웨어에서는 가능한 경우 사용하지 않아야 합니다. 해당되는 경우 복잡한 수학 연산 대신 룩업 텍스처를 사용하는 방법을 고려하십시오.
연산을 직접 작성하는 것(normalize
, dot
, inversesqrt
등)을 피해야 합니다. Unity의 빌트인 옵션은 드라이버가 훨씬 나은 코드를 생성할 것을 보장합니다. Alpha Test(discard
) 연산은 종종 사용자의 프래그먼트 셰이더를 느려지게 할 수 있음을 기억해야 합니다.
표면 셰이더는 조명과 상호작용하는 셰이더를 작성할 때 적합합니다. 그러나 표면 셰이더의 디폴트 옵션은 일반적인 경우를 전반적으로 다루도록 조정되어 있습니다. 이를 미세조정하여 특정 상황에 맞게 셰이더 속도를 높이거나 최소한 크기를 줄일 수 있습니다.
approxview
지시자(뷰 방향, 즉 스페큘러에 사용)는 뷰 방향을 픽셀당이 아닌 버텍스당으로 정규화합니다. 이 값은 추정값이지만 대부분의 경우 충분히 사용할 만합니다.halfasview
는 더 빠릅니다. 반 벡터(조명 방향과 뷰 벡터 사이의 중간)는 버텍스당 계산되고 정규화되며, 조명 함수는 뷰 벡터 대신 반 벡터를 파라미터로 받게 됩니다.noforwardadd
를 사용하면 셰이더가 포워드 렌더링에서만 단방향광을 완전히 지원합니다. 그 외의 광원은 버텍스당 광원 또는 구면 하모닉스로써 여전히 효력이 있습니다. 이를 통해 셰이더 크기를 줄일 수 있고 여러 광원이 존재하더라도 셰이더가 하나의 패스로 렌더링하도록 해 줍니다.noambient
는 셰이더에서 주변광과 구면 조화 광원을 비활성화하면 성능이 약간 빨라집니다.고정 함수 AlphaTest 또는 같은 기능을 하는 프로그래밍 가능한 clip()
은 플랫폼에 따라 다른 성능 특성을 보입니다.
일부 플랫폼(iOS 및 Android 디바이스 대부분의 모바일 GPU)에서는 ColorMask를 사용하여 채널을 제외하는 작업(ColorMask RGB
)에는 리소스가 많이 사용되로 꼭 필요할 경우에만 사용합니다.