프로젝트를 빌드할 때마다 Unity 에디터는 빌드가 필요로 하는 모든 셰이더, 즉 필요한 모든 그래픽스 API에 대해 필요한 모든 셰이더 배리언트를 컴파일합니다.
Unity 에디터에서 작업할 때 에디터는 모든 요소를 미리 컴파일하지 않습니다. 모든 그래픽스 API에 대해 모든 배리언트를 컴파일하는 데에는 매우 오랜 시간이 소요될 수 있기 때문입니다.
대신 Unity 에디터는 다음을 수행합니다.
Library/ShaderCache
폴더를 확인합니다.셰이더 컴파일은 UnityShaderCompiler
라는 프로세스를 사용합니다. 다수의 UnityShaderCompiler
프로세스가 시작될 수 있어 (보통
컴퓨터의 CPU 코어당 하나) 플레이어 빌드 시에 셰이더 컴파일이 동시에 진행될 수 있습니다.
에디터는 셰이더를 컴파일하지 않고 컴파일러 프로세스는 아무 일도 하지 않으며 컴퓨터 리소스를 소비하지 않습니다.
자주 변경되는 셰이더가 많으면 셰이더 캐시 폴더가 꽤 커질 수 있습니다. 이 폴더는 Unity가 셰이더 배리언트를 다시 컴파일하게 만들 뿐이므로 삭제하는 것이 안전합니다.
플레이어 빌드 시에는 “아직 컴파일되지 않은” 모든 셰이더 배리언트가 컴파일되므로 이러한 배리언트들이 에디터가 사용하지 않았어도 게임 데이터에 포함됩니다.
다음과 같이 플랫폼마다 서로 다른 셰이더 컴파일러를 셰이더 프로그램 컴파일에 사용합니다.
pragma 지시문을 사용하여 여러 셰이더 컴파일러 설정을 설정할 수 있습니다.
셰이더 컴파일에는 여러 단계가 소요됩니다. 첫 단계는 프리 프로세싱입니다. 이 단계에는 프리 프로세서라는 프로그램이 컴파일러의 셰이더 소스 코드를 준비합니다.
이전 Unity 버전에서는 셰이더 컴파일러가 현재 플랫폼에 제공하는 프리 프로세서를 에디터가 사용했습니다. 이제는 Unity의 캐시 셰이더 프리 프로세서를 사용하는 것과 이전 동작으로 되돌아가는 것 중에서 선택할 수 있습니다. 문제가 없는 한 캐시 셰이더 프리 프로세서를 사용하십시오.
캐시 셰이더 프리 프로세서는 더 빠른 셰이더 임포트와 컴파일에 최적화되어 있습니다(최대 25% 더 빠름). 이 프리 프로세서는 중간 프리 프로세싱 데이터를 캐시하여 작동하므로, 에디터는 include 파일의 콘텐츠가 변경되는 경우에만 해당 파일을 파싱하면 됩니다. 따라서 같은 셰이더의 여러 배리언트를 더 효율적으로 컴파일할 수 있습니다. 캐시 셰이더 프리 프로세서 활성화는 프로젝트 내 셰이더가 대규모 세트의 일반적인 include 파일을 사용하는 경우 가장 효과적입니다.
캐시 셰이더 프리 프로세서는 성능 개선 외에도 다음의 기능을 추가로 제공합니다.
#pragma
지시문을 제한적으로 지원합니다.#pragma warning
지시문을 지원합니다.#include_with_pragmas
지시문을 지원하여 include 파일에 #pragma
지시문을 넣을 수 있습니다.캐시 셰이더 프리 프로세서와 이전 동작의 차이를 자세히 알아보려면 Unity 포럼의 글 새로운 셰이더 프리 프로세서를 참조하십시오.
Editor settings 창의 Shader Compilation 섹션에 있는 Caching Shader Preprocessor 체크박스 또는 EditorSettings.cachingShaderPreprocessor API를 사용하여 캐시 셰이더 프리 프로세서를 활성화하거나 비활성화할 수 있습니다.
Unity는 게임 빌드 중에 게임에서 사용되지 않는 몇몇 내부 셰이더 배리언트를 찾아 빌드 데이터에서 제외(“스트리핑”)할 수 있습니다. 빌드 타임 스트리핑은 다음을 제거하기 위해 수행됩니다.
#pragma shader_feature
를 사용하는 셰이더의 경우 Unity는 배리언트가 사용되는지 여부를 자동으로 확인합니다. 빌드의 아무 머티리얼도 배리언트를 사용하지 않는 경우 해당 배리언트는 빌드에 포함되지 않습니다. 내부 셰이더 배리언트 문서를 참조하십시오. 이는 스탠다드 셰이더에서 사용됩니다.위의 조합을 사용하면 셰이더의 데이터 크기가 상당히 줄어듭니다. 예를 들어 완전히 컴파일된 스탠다드 셰이더는 수백 메가바이트를 차지하지만 일반적인 프로젝트에서는 몇 메가바이트만 차지합니다. 또한 애플리케이션 패키징 과정에서 이 용량은 더욱 압축됩니다.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.