- 제 목
- 강좌/정보 월드 최적화 GPU 인스턴싱 사용해서 드로우콜 줄이기
- 글쓴이
- 마끼아또
- 추천
- 7
- 댓글
- 3
- 원본 글 주소
- https://gall.dcinside.com/vr/369820
- 2020-02-23 19:50:45
요약
1. 오브젝트가 동일한 메쉬랑 머테리얼을 사용해야 함
2. Light Probes(유니티 2017이하에서만), Receive Shadows를 꺼야 함
3. 머테리얼 설정에서 Enable GPU Instancing을 체크해야 함
4. 실시간 라이팅에 영향을 받지 않아야 함
5. 오브젝트에 사용되는 머테리얼을 최적화해서 최대한 1개의 머테리얼로 줄이면 좋음
서론
GPU 인스턴싱(GPU Instancing)은 간단히 말해서 같은 머테리얼을 사용하는 동일한 오브젝트는 그래픽 카드가 그릴 때 한꺼번에 그려서 프레임을 올려주는 최적화 기술임
컴퓨터 그래픽에서 보통은 오브젝트랑 머테리얼을 하나 하나씩 그리는데 이걸 몇 번하는지를 횟수로 표현한 게 드로우콜(Drawcall)이라고 함, 횟수가 높을 수록 부하가 커지므로 그래서 GPU 인스턴싱을 이용해서 똑같은 오브젝트를 묶어서 한 번에 그리게 하면 드로우콜 횟수가 줄어들게 되고 프레임이 올라가는 거임
보통 월드 제작에서는 나무라던가 풀 같은 오브젝트에 쓸 수 있고, 브붕이들은 좋아하는 파티클 같은 것도 이러한 기술을 이용하면 최적화할 수 있게 되는거지, 그래서 강좌에서 위에 적은 요약본에 대해서 자세하게 풀어서 쓸 거임
GPU 인스턴싱 적용 방법
예시로 예전에 섯다 월드를 만들 때 게임에 사용했던 돈 오브젝트들이야
Game 탭에 들어가서 우측 상단의 Stats 버튼을 누르면 카메라에 보이는 현황을 표시해 주는데, 여기서 Batches가 드로우콜 횟수를 의미해, 즉 해당 장면을 그리는데 65회의 드로우콜이 들어간다는 뜻이지, 그리고 옆에 있는 Saved by batching이 GPU 인스턴싱으로 줄어든 드로우콜 횟수를 의미하는데 하나도 줄어들지 않은 모습을 볼 수가 있어
먼저 해당 오브젝트의 머테리얼 설정 창에서 ‘Enable GPU Instancing’ 을 체크를 해 줘
Light Probes와 Receive Shadows 기능을 해제해 줘, Reflection Probes도 드로우콜에 영향을 주지만 오브젝트를 한 번에 묶어서 렌더링 한 다음에 반사를 구현하는지 크게 횟수가 증가하지는 않아, 추후에 VRChat 오픈 베타(유니티 2018)가 정식으로 릴리즈 되면 Light Probes는 안 꺼도 무방해
그러면 이렇게 28회의 드로우콜이 절약이 되면서 37회의 드로우콜 만으로 한 장면을 그릴 수 있게 되었어
하지만 Light Probe가 빠지게 되면서 글로벌 라이팅(기본적으로 스카이박스 색상)만 받게 되면서 주변 환경과 이질감이 드는 걸 볼 수 있어, 조금 전의 설명처럼 유니티 2018로 업데이트 되게 되면 Light Probe도 쓸 수 있게 되니 이러한 걱정을 할 필요가 없겠지만, 유니티 2017에서는 안 되므로 글로벌 라이팅을 바꿔서 해결할 거야
Window > Lighting > Settings 에 들어가면 글로벌 라이팅을 설정 할 수 있는데, 나는 간단하게 Color를 이용해서 주변 색과 유사하게 만들어줬어
이렇게 하면 오브젝트가 움직일 때 비록 빛에 반응해서 밝아지거나 어두워지진 않지만, 게임 월드의 특성상 이 정도의 그래픽 한계는 충분히 납득이 될 거라 생각해서 적용하였어, 여기서 고성능 플레이어에게 옵션을 준다면 Light Probe 적용 옵션을 선택으로 남길 수 있으면 더욱 더 좋겠지
여기서 주의해야 될 점은 라이트맵을 구울 때에 해당 글로벌 라이팅 설정도 영향을 주므로 라이트맵을 굽고 나서 세팅하는 게 좋아
드로우콜과 GPU 인스턴싱 최적화 과정
어떻게 하면 GPU 인스턴싱 발동이 되는 걸까? 여기에는 디테일한 조건이 있어
제일 중요한 건 동일한 메쉬랑 동일한 머테리얼이어야만 해, 생각보다 이게 최적화할 때 까다로운 조건이야
좌측/중간/우측이 모두 유니티 상에서는 개별적인 오브젝트이야, 같은 머테리얼을 사용하고 있어서 한 번에 그릴 수 있지 않을까 생각하지만 컴퓨터 입장에서는 메쉬(형태)가 같지 않으므로 인스턴싱은 일어나지 않아, 만약 여기서 인스턴싱을 꼭 하고 싶다면 1개짜리 오브젝트를 유니티에서 복제해서 똑같은 형태로 만들어주면 되겠지만 나는 약간의 개발 편의를 위해서 3개 정도 메쉬로 분화시켰어
화투패도 메쉬의 외형도 동일하고 머테리얼도 동일하니까 되지 않을까 생각되겠지만, UV가 다르기 때문에 인스턴싱은 일어나지 않아, 이를 통해서 버텍스 데이터까지 동일한 완전히 같은 물체만 인스턴싱이 일어나는 걸 알 수 있어, 화투패를 굳이 인스턴싱을 하고 싶다면 앞면만 따로 메쉬를 떼어버리고 나머지 면을 묶으면 인스턴싱이 되겠지만 효용성이 떨어질거라 생각해서 하지 않았어, 하지만 이런 방법을 쓸 수 있는 경우도 있어
이건 개인 월드의 퀘스트 버전에서 스크린샷을 모아두는 곳인데, 앨범 프레임은 GPU 인스턴싱으로 묶어버리고 이미지만 개별 메쉬로 렌더링한 모습이야, 앨범 이미지가 바뀌더라도 유연하게 대응이 가능하고 최적화를 위해서 수 십장의 텍스쳐를 만들거나 UV를 할당할 필요가 없어져
한 가지 특기할 사항으로 라이트맵으로 구워진 오브젝트는 인스턴싱이 되지 않는 걸 볼 수 있어, GPU 인스턴싱으로 최적화하려면 라이트맵을 빼야하니 여기서 오브젝트의 중요도에 따라서 트레이드 오프를 해야 해, 이 부분은 모르는 점도 많으니 틀린 점이 있으면 지적해 줘
- 정적 오브젝트 여러 개를 하나로 묶어서 단일 물체로 만들기
- 라이트맵을 포기하고 글로벌 라이팅 적용
전자 같은 경우에는 바로 위의 예시 같은 상황에 적합해 좁은 곳에 움직이지 않는 오브젝트들이 뭉쳐 있으니 메쉬들을 묶어서 하나의 메쉬로 만들면 라이트맵을 굽더라도 약 2번의 드로우콜로 줄일 수 있어, 단점은 오클루전 컬링 같은 기술과 상반되어서 화면에 일부가 보이더라도 무조건 전체를 드로우해야 해, 그래서 적당히 지역별로 묶인 오브젝트를 여러 개 만들어야 해, 그렇기 때문에 그만큼 모델링과 텍스쳐링에 더 투자를 해야 되니 제작자가 부담해야 되는 노동력이 증가하고 기존의 에셋과 같은 물체가 아니므로 메모리와 스토리지를 더 투자하게 되지만 보통은 성능이 더 올라감
후자 같은 경우에는 먼 곳에 위치한 나무라던가 풀 같이 중요도가 떨어지는 오브젝트에 쓰기에 좋아, 라이트맵은 빠지기에 시각적 퀄리티는 다소 떨어지지만 고정된 물체라면 오클루전 컬링도 쓰기에도 적합해서 월드 전체에 위치해 있어도 가변적으로 최적화를 할 수 있어
그렇다면 아예 변형을 줄 수는 없는걸까?
기본적으로 위치, 회전, 크기에는 영향을 받지 않음, 이를 통해서 Pickup 오브젝트들이 가지는 자유롭게 움직이는 특성에 적합하다는 걸 알 수 있어, 우측에 물체를 3으로 키웠음에도 불구하고 인스턴싱이 되는 걸 볼 수 있어, 여기서 유니티 매뉴얼에서는 컬러 같은 쉐이더 옵션으로 다르게 지정 가능하다고 하지만 따로 쉐이더를 수정하거나 작성해야 되므로 여기서는 생략할 게
더욱 더 효과적으로 드로우콜을 줄일려면 머테리얼을 최적화하는 과정을 해 줘야 해, 개발 버전에는 돈에 무려 3개의 마테리얼(!)이 들어가 있어서, 한 개의 돈뭉치를 그릴 때마다 드로우콜이 3회가 들어가고 있었어
이에 텍스쳐와 UV를 최적화해서 1개의 머테리얼로 줄였어, 예시의 물체는 간단해서 수작업으로 해도 오래 걸리지 않지만, 조금이라도 복잡해지면 텍스쳐 최적화하기 힘들어지기 시작해
이런 경우에는 블렌더에서도 텍스쳐 페인팅 기능이 있지만 다양한 텍스쳐 맵까지 들어가는 복잡한 텍스쳐 최적화는 서브스탠스 페인터 같은 외부 프로그램 쓰는 것도 추천해, 학생인 브붕이라면 1년 단위로 갱신해서 무료로 쓸 수 있어
이렇게 머테리얼 최적화와 GPU 인스턴싱을 활용하면 동일한 오브젝트가 많은 경우에서도 부하를 줄일 수 있으므로 플레이어들이 좀 더 쾌적하게 게임을 즐길 수 있게 됨
고성능 PC에서는 예제 정도의 수준은 인스턴싱을 하지 않더라도 가볍게 돌릴 수 있지만, 이렇게 컨텐츠를 만들면서 최적화를 하지 않는 습관이 누적되고 쌓이고 쌓이다 보면 오큘러스 퀘스트 같은 저사양 모바일에서는 곧바로 영향을 받고 PC VR까지 조금씩 영향을 주고 결국에는 PC에서도 점점 성능이 하락되는게 체감이 될 거야, VRChat 크리에이터들이 월드랑 캐릭터 제작하는 과정에서 최적화를 신경 쓰지 않는 경우가 많은데 이런 경향이 계속 되면 결국에는 모두가 직접 만들어가는 게임의 특징이 점차 빛을 바래게 될 거라 생각해, 아직은 VRChat 운영팀이 최적화를 열심히 한다고 어드벤티지를 주지 않아서 많은 사람들이 최적화가 어렵고 번거롭기도 하고 예쁘면 그만이니까 하고 최적화가 필요 없다고 생각하고 있는 점이 안타까워, 비록 작은 강좌이지만 보고 더 많은 사람들이 최적화에 관심을 가져줬으면 좋겠어
레퍼런스 : Unity 공식 메뉴얼 ( https://docs.unity3d.com/kr/current/Manual/GPUInstancing.html )
조개껍데기 | 추 | 2020.02.23 20:46:40 |
ㅇㅇ | 강좌추 220.119 | 2020.02.23 21:01:07 |
Byanka | 개추 - dc App | 2020.02.23 22:23:55 |