나도 뉴비지만, 삽질을 좀 해서 같은 피해자가 나오지 않기를 바람.
Outline은 꽤 많은곳에 사용되는데, 보통 AssetStore 에서 가져옴.
우리들의 든든한 무료에셋 "Quick Outline" (광고아님)
근데 이걸 무턱대고 쓰다보면 엄청난 장면을 보게되는데,
TD 프로토타입의 한장면.
모든 오브젝트에 테두리를 입히고 싶었지만, 지금 타워 12개에 사람 150명 가까이 있는데,
Batches 가 1637, SetPass call이 551번 호출됨.
뭐지... 하고 프레임 디버거를 보면
플레이어의 테두리를 하나씩 따로 그리고있는 걸 알 수 있음.
바로 위에보면 SRP Batcher가 1000개 가까이 묶지를 못하고있음
아쉽게도 에셋에 있는 쉐이더 중 하나의 파일은 SRP Batcher 호환이 되지않음.
대충 아래 경고를 구글링하면 해결방법이 나옴.
이런식으로 프로퍼티를 CBUFFER 안에 넣어주면 됨.
그러면 SRP Batcher 가 compatible 로 바뀜.
테스트용으로 사람을 300명 스폰해본 결과는 아래와 같음.
좀전에 봤던 프레임 디버거의 DrawTransparentObjects 의 드로우콜이 4번까지 줄어든걸 볼 수 있음.
Stats 창에서는 SRP 배칭으로 save된게 반영이 안되는데, SetPass Call은 31로 굉장히 줄어든게 보이는걸 알 수 있음.
(이거떄매 삽질을 좀 오래 했음)
이걸로 얻을 수 있는 효과는 의외로 렌더링쓰레드가 아니라 메인쓰레드에 있었음.
난 당연히 배치를 줄이고 Setpass call을 줄였으니까 더 빠르게 그리겠지.. 라고 생각했는데
DrawTrans~ 부분을 보면 1.73 -> 0.73 으로 1ms 가 줄었음.
프로파일링 하는게 컴퓨터기도 하고,
타겟을 모바일 60fps 로 잡으면 프레임당 최대 16.7 ms 니까 나쁘지 않아 보이지만,
render thread 프로파일링 해보니까 30퍼가 메인쓰레드 기다리는 함수였음....
그럼 메인쓰레드를 한번 봐보면,
DoRenderLoop 함수가 4.45 -> 2.37ms 까지 약 절반 가까이 줄어든걸 확인할 수 있음
배칭이 줄어드니까 CPU에서 GPU 에 보낼 드로우콜 만드는 시간이 줄어든 듯.
---
SRP 배처가 인스턴스 머터리얼도 싹다 묶어줘서 위처럼 간단하게 가능한건데,
인스턴스 머터리얼 로드/Instantiate 하는게 찝찝하거나 메모리가 신경쓰이면 Outline.cs 파일을 수정하면됨
필요없는건 serializeField를 없애주고, 필요한건 public으로 바꿔줌.
그다음에 인스턴스화 하는 부분을 주석처리하고
+ 머터리얼 수정하는 부분 + Destroy하는 부분
총 세 부분을 주석처리하면 shared material 로 outline 이 적용됨.
굿
정보추
신기하네
나도 이거 쓰는데 이런 문제가 개발자가 고쳐주면 좋은데 업뎃 끊겨서 아쉽고만
갓 고수수고수