VRChat 마이너 갤러리 저장소

제 목
강좌/정보 월드 최적화 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
번호 분류 제목 글쓴이 날짜 추천
370137 일반 지금 서버 안 좋아? ㅇㅇ 211.57 2020-02-24 0
370136 일반 본인 요즘 글쓰면 평균조회수 100정도 나옴 ㅇㅇ 13 dox 2020-02-24 1
370135 일반 집처럼 생겼고 방에 비번있고 마요네즈있는 월드아는사람 ㅇㅇ 121.169 2020-02-24 1
370134 일반 학원그만두고 청소일이나 다시할가 13 쿰척쿰척 2020-02-24 0
370133 질문 인덱컨 회전키가 안됨 1 하이위자드 116.39 2020-02-24 0
370132 일반 누워서 계속 뒤척거리다가 디시하네 2 양산형이세계물 2020-02-24 0
370131 일반 Cyberpunk 2077 2 Alex7756 2020-02-24 4
370130 일반 오늘 유명한분봄 1 꿀뚤 2020-02-24 0
370129 일반 노무현 운지 1 tntnt 121.200 2020-02-24 0
370128 일반 굳밤 4 tntnt 2020-02-24 0
370127 일반 나쓰레기야? 3 ㅇㅇ 1.242 2020-02-24 0
370126 일반 나만 인터넷 안돼냐 꿀뚤 2020-02-24 0
370125 일반 요즘 옷사는거에 맛들린듯 6 설탕달다 2020-02-24 0
370124 일반 아니 디시광고 에반데 7 아루라테 2020-02-24 0
370123 일반 트래커 절전모드 어떻게 꺼 ?? 3 ㅇㅇ 106.243 2020-02-24 0
370122 일반 글이 짤렸네요 2 HOD28X30 2020-02-24 0
370121 일반 쿄코랑 어올리는 건담찾은거같음 2 반다이몰 2020-02-24 0
370120 일반 좆목극혐이노 이기 2 momono 175.223 2020-02-24 5
370119 일반 잘자 좋은꿈꿔 4 Cotori 2020-02-24 0
370118 일반 오늘 출근 하면 퇴근 못할수도 이써... 2 배춧잎 2020-02-24 0
370117 강좌/정보 여지껏 만든 것을 배포하고 있습니다 1 HOD28X30 2020-02-24 0
370116 일반 잠이안와 1 ㅇㅇ 182.219 2020-02-24 0
370115 일반 너 야해 1 노라 2020-02-24 0
370114 일반 아바타 전체 크기 조절하는거 2 Emeris 2020-02-24 0
370113 일반 다들 빨리 자라고~ 4 양산형이세계물 2020-02-24 0
370112 일반 야한 유우코 친구의 친구들과 노는것도 재밌다 5 아루라테 2020-02-24 0
370111 VRC일기 오늘 한 거 11 온의 2020-02-24 0
370110 일반 열나고 기침나고 어지러워 7 마피뇽 2020-02-24 0
370109 일반 목소리 안좋은사람싫다 8 이슬찡 2020-02-24 0
370108 일반 꿀잼주의) 가장 야한 도박은? 2 유언소녀 2020-02-24 0
370107 일반 나도 목소리 좋았으면 좋겠다 9 ㅇㅇ 115.126 2020-02-24 0
370106 일반 요즘은 유니티로 쉐잎키 바꿔서 mmd 표정 먹히게함? 3 liar 2020-02-24 0
370105 일반 18년 2월달에 시작했네 2 ㅇㅇ 180.65 2020-02-24 0
370104 일반 간단한 모델링해줌 4 koper2004 2020-02-24 0
370103 일반 미코쓰는새끼들 잘 이해안감ㅋㅋㅋ 왜쓰지이걸? 4 흐린바다 2020-02-24 0
370102 일반 수인모델링 오늘은 셰이프키깎음 7 적쥐 2020-02-24 0
370101 일반 손때문에 사진찍은거 망함 1 타입문 2020-02-24 0
370100 일반 뱔챗하고 싶다 6 Byanka 2020-02-24 0
370099 일반 구와아아아앙 2 헌책 2020-02-24 0
370098 일반 아아아아아아ㅏ아앙 4 JUICY 2020-02-24 0
념글 삭제글 갤러리 랭킹