Optimizing Shader Load Time

반응형

필요에 의해 모자란 실력으로 번역하였습니다.

원문을 참고하시길 권해드립니다. 

원문에 대한 링크는 아래 Reference Link에 있습니다.


셰이더 로드 시간 최적화.

셰이더는 GPU에서 실행되는 작은 프로그램이며, 로딩하는데 시간이 좀 걸린다.

각 개별 GPU 프로그램은 전형적으로 로드하는데 많은 시간이 필요하지 않지만

셰이더는 내부적으로 많은 "변형"을 가지고 있다.

예를 들어 Standard Shader의 경우, 완전히 컴파일 되면, 조금씩 다른 수천개의

GPU 프로그램이 되는데 이는 두가지 잠재적 문제를 만든다.

1. 셰이더 변형이 많으면 게임 구축시간과 게임 데이터 사이즈가 증가한다.

2. 많은 수의 셰이더 변형을 로딩하는 동안 게임은 느려지고 메모리는 증가한다.


Shader build time stripping

게임을 빌드하는 동안 유니티는 내부 셰이더 변형중에서 일부가

게임에 사용되지 않는걸 감지하여 빌드데이터에서 스킵할 수 있다.

build time stripping이 아래와 같은 일을 한다.


1. #pragma shader_feature 구문을 사용하는 셰이더에 대한 개별 셰이더 특성.

만약 특정 변형을 사용하는 머티리얼을 쓰는곳이 없다면 빌드에 포함되지 않는다.

내부 셰이더 변형 문서를 참조.

내장 셰이더중에서는 표준셰이더가 이것을 사용한다.

2. 어느 scene에서도 사용되지 않는 안개와 라이트 매핑 모드를 처리하는 셰이더 변형은

게임 데이터에 포함되지 않는다.

원한다면 이 기능은 Graphics Settings를 참고하여 오버라이드 할 수 있다.


위의 조합을 사용하면 셰이더 데이터 크기가 크게 줄어든다.

예를들어, 완전히 컴파일 된 표준 셰이더는 수 백 메가 바이트 이지만,

일반적인 프로젝트에서는 단지 2메가 바이트 정도밖에 되지 않으며

종종 응용 프로그램 패키징 과정에 의해 더 압축이 된다.


Default Unity shader loading behavior

모두 기본설정으로 되어 있다면 유니티는 shaderlab shader 오브젝트를 메모리로

로드하지만 내부 셰이더 변형이 실제로 필요하기 전까지는 생성하지 않는다.


이는 게임 빌드 안에 포함된 셰이더 변형들이 사용 될 가능성이 있지만,

실제로 사용되기 전까지는 로드 시간이나 비용이 없다는 것을 의미한다.

예를 들어, 셰이더는 항상 그림자가 있는 점광원을 처리하는 변형을 포함하지만,

만약 게임에서 절대 그림자가 있는 점광원을 사용하지 않는다면 , 이 특별한 변형을

굳이 로드할 의미가 없다.


이러한 기본 동작은 셰이더 변수가 필요해 지는 첫번 째 순간에

새 GPU 프로그램 코드가 그래픽 드라이버에 로드되어야 하기 때문에

렉이 걸릴 수 있다는 부작용이 있다.

이러한 현상이 게임 플레이 중에 발생하는 것은 그닥 좋지 않기 떄문에

유니티는 ShaderVariantCollection asset을 사용하여 이 현상을 해결한다.


Shader Variant Collections

ShaderVariantCollection은 기본적으로 셰이더들의 목록 에셋이며,

각 셰이더는 로드 할 패스 타입들과 셰이더 키워드 조합들의 목록이다.


Shader variant collection inspector


실제로 사용되어지는 셰이더와 셰이더의 변형을 기반으로 이 에셋을 만들기 위해,

에디터는 셰이더와 셰이더의 변형이 실제로 사용되어지는지를 추적 할 수 있다.

Graphics Settings 에는 현재 추적된 셰이더에서 새로운 ShaderVariantCollection을 

만드들거나 현재 추적된 셰이더 목록을 지우는 버튼이 있다.


에디터에서 사용되어지는 셰이더로부터 ShaderVariantCollection을 생성.

한번 ShaderVariantCollection 에셋이 있으면, 게임을 로드하는 동안

변형들이 자동으로 선로딩(Graphics Settings에 있는 선로딩 셰이더 리스트)

되어지도록 설정하거나, 스크립트에서 개별 셰이더 변형 모음을 선로딩 할 수 있다.

이에 대해서는 SHaderVariantCollection 클래스를 참조하자.


Reference Link

- Optimizing Shader Load Time (원문)

- Making multiple shader program variants (원문)

- Standard Shader (원문)

- Graphics Settings (원문)

- ShaderVariantCollection (원문)

'Unity > Unity Study' 카테고리의 다른 글

sending message header failed  (0) 2017.02.26
Unity 5.5 AssetBundle.LoadAssetAsync  (0) 2017.01.18
특정 android mobile chipset에서 half 문제  (0) 2016.09.21
shader tip with Intel  (0) 2016.09.08
unity bug with tegra k1  (0) 2016.09.03
TAGS.

Comments