나도 뉴비지만, 삽질을 좀 해서 같은 피해자가 나오지 않기를 바람.



Outline은 꽤 많은곳에 사용되는데, 보통 AssetStore 에서 가져옴.


24b0d121e09c28a8699fe8b115ef046c67f32949


우리들의 든든한 무료에셋 "Quick Outline" (광고아님)


근데 이걸 무턱대고 쓰다보면 엄청난 장면을 보게되는데,



24b0d121e09c28a8699fe8b115ef046f574d909fa1


TD 프로토타입의 한장면.


모든 오브젝트에 테두리를 입히고 싶었지만, 지금 타워 12개에 사람 150명 가까이 있는데, 


Batches 가 1637, SetPass call이 551번 호출됨.


뭐지... 하고 프레임 디버거를 보면 



24b0d121e09c28a8699fe8b115ef046ec34dcffe


플레이어의 테두리를 하나씩 따로 그리고있는 걸 알 수 있음.


바로 위에보면 SRP Batcher가 1000개 가까이 묶지를 못하고있음


아쉽게도 에셋에 있는 쉐이더 중 하나의 파일은 SRP Batcher 호환이 되지않음.



24b0d121e09c28a8699fe8b115ef046ec94ecbf0


대충 아래 경고를 구글링하면 해결방법이 나옴.



24b0d121e09c28a8699fe8b115ef046a7965ea


이런식으로 프로퍼티를 CBUFFER 안에 넣어주면 됨.




24b0d121e09c28a8699fe8b115ef046f564c9f9a


그러면 SRP Batcher 가 compatible 로 바뀜.


테스트용으로 사람을 300명 스폰해본 결과는 아래와 같음.


24b0d121e09c28a8699fe8b115ef046ecd40cafe


좀전에 봤던 프레임 디버거의 DrawTransparentObjects 의 드로우콜이 4번까지 줄어든걸 볼 수 있음.



24b0d121e09c28a8699fe8b115ef046ecc4ac2f7


Stats 창에서는 SRP 배칭으로 save된게 반영이 안되는데, SetPass Call은 31로 굉장히 줄어든게 보이는걸 알 수 있음.

(이거떄매 삽질을 좀 오래 했음)


이걸로 얻을 수 있는 효과는 의외로 렌더링쓰레드가 아니라 메인쓰레드에 있었음.


난 당연히 배치를 줄이고 Setpass call을 줄였으니까 더 빠르게 그리겠지.. 라고 생각했는데



24b0d121e09c28a8699fe8b115ef046ecb4acaf1



24b0d121e09c28a8699fe8b115ef046f5d4a9c97


DrawTrans~ 부분을 보면 1.73 -> 0.73 으로 1ms 가 줄었음.


프로파일링 하는게 컴퓨터기도 하고,

타겟을 모바일 60fps 로 잡으면 프레임당 최대 16.7 ms 니까 나쁘지 않아 보이지만,


render thread 프로파일링 해보니까 30퍼가 메인쓰레드 기다리는 함수였음....


그럼 메인쓰레드를 한번 봐보면,



24b0d121e09c28a8699fe8b115ef0469943ef5bd


24b0d121e09c28a8699fe8b115ef046c65f82a4e


DoRenderLoop 함수가 4.45 -> 2.37ms 까지 약 절반 가까이 줄어든걸 확인할 수 있음


배칭이 줄어드니까 CPU에서 GPU 에 보낼 드로우콜 만드는 시간이 줄어든 듯.



---


SRP 배처가 인스턴스 머터리얼도 싹다 묶어줘서 위처럼 간단하게 가능한건데,


인스턴스 머터리얼 로드/Instantiate 하는게 찝찝하거나 메모리가 신경쓰이면 Outline.cs 파일을 수정하면됨



24b0d121e09c28a8699fe8b115ef04699d31f1b8


필요없는건 serializeField를 없애주고, 필요한건 public으로 바꿔줌.



24b0d121e09c28a8699fe8b115ef046ecc4ac3f4


그다음에 인스턴스화 하는 부분을 주석처리하고


+ 머터리얼 수정하는 부분 + Destroy하는 부분 


총 세 부분을 주석처리하면 shared material 로 outline 이 적용됨.





2af3d72fe3f206a26d81f6e742867d65ceb4


굿