쉐이더 메모리 최적화
쉐이더에는 multi_compile와 shader_feature 라는 기능이 있다.
쉐이더의 베리언트를 나눠서 하나의 쉐이더에서 여러 기능을 구현 할 수 있도록 해주는 것인데 둘의 차이라면 multi_compile는 모든 분기가 빌드에 포함되고 shader_feature 사용중인 분기만 빌드에 포함된다는 것이다.
그러면 shader_feature 만 쓰면 된다고 생각 할 수도 있지만 런타임중에 분기가 바뀌는 경우에는 shader_feature 의 경우 빌드에 포함되지 않았기 때문에 동작이 제대로 되지 않는다.
그렇다고 multi_compile를 전부 쓰면 쉐이더의 베리언트가 배로 계속 늘어 무식하게 커지게 된다.
pc게임이라면 어느정도 사이즈는 신경 쓰지 않을 수 있지만 회사에서 모바일 게임을 개발 중이기 때문에 민감하지 않을 수 가 없었다.
-Unity Urp Lit Shader-
빌트 인 쉐이더의 standard 쉐이더를 대체하는 urp의 기본 lit 쉐이더의 기본 베리언트들이다.
일반적인 게임에서는 그냥 사용해도 별 무리가 없으나 해당 쉐이더를 개조해서 게임에서 사용중이 였기 때문에 multi_compile로 더늘고 최종본에서는 최대 140mb 가까이 메모리를 먹었었다.
이 경우 필요없는 베리언트들을 줄이는 작업을 해주면 좋다.
-수정된 Lit Shdaer-
_MAIN_LIGHT_SHADOWS_CASCADE
캐스케이드 관련 키워드이다 모바일게임이다 보니 사용하지 않아 지웠다.
_ADDITIONAL_LIGHTS
_ADDITIONAL_LIGHTS_VERTEX는 사용하지 않아서 지웠다.
_ADDITIONAL_LIGHT_SHADOWS
추가 라이트의 그림자는 지원하지 않아서 지웠다.
_MIXED_LIGHTING_SUBTRACTIVE, DIRLIGHTMAP_COMBINED, LIGHTMAP_ON
라이트맵 관련 키워드인데 라이트맵을 사용하지 않아 지웠다.
multi_compile_instancing
GPU instancing 기능을 사용할 때 사용하는 키워드인데 어차피 srp를 사용할거기 때문에 제거했다.(terrain의 경우 srp적용이 안되서 terrain lit 쉐이더를 수정할 경우 남겨둔다.)
기본 lit 쉐이더에서 해당 작업을 진행 할 경우 베리언트 수가 9로 줄어 들게 된다.
모든 기본 쉐이더에서 해당 작업을 진행하면 제법 쏠쏠한 이득을 챙길 수 있다.
해당 수정사항들은 패키지 파일의 스크립트를 수정 하는 것이니 패키지 파일을 Package 폴더로 따로 이동해 custom하게 사용을 해야한다.(그렇지 않으면 유니티를 재부팅하면 원상복구된다.)