자 기 소 개
안녕하세요. 조금이라도 가벼운 월드를 만들고싶은 VRChat 월드 개발자중 하나인 steen이라고 합니다.

어떤 월드는 사람이 많아도 VR기준 20프레임은 나와서 잘 방어가 된다거나
어떤 월드는 사람이 접속해 있지도 않은거 같은데 많이 버벅거리는 월드가 있기도 합니다

이 두가지 사례를 연구하면서 저만의 최적화 방식이 생겼답니다.
그리하여, 월드의 프레임이 낮아지는 이유는 무엇인지 알아보고 어떻게 최적화를 하면 좋을지 소개해드리도록 하겠습니다!

-라이트 베이킹 편-

*전문적이지 않을 수 있고, 개인적인 생각이므로 감안하여 읽어주시면 감사드리겠습니다.
월드 최적화을 하기 위해서 가장 먼저 만든 월드가 무거운지 가벼운지 살펴보는 수치를 알려드리겠습니다

먼저, 플레이 버튼을 눌러주시고 사진에 나온 버튼을 눌러줍시다. 

버튼을 누르셨다면, 여러가지의 수치들이 나온답니다.
여기서 최적화를 하기위해 봐야할 곳은 동그라미을 친 Batches 의 수치를 잘 보셔야 합니다. 

이수치는 실시간으로 연산이 되고 있는 모든것의 수치라고 보시면 됩니다.
(실시간 라이트,오브젝트의 메쉬,스카이박스 등)

지금 보면 20000~ 대로 엄청 높은걸 볼 수 있답니다.
이러면, 인겜에서 혼자있어도 30프레임 방어도 안됩니다.

보통 200 아니면 높더라도 1000안까지는 되야 최적화 성공이라고 생각합니다.
이제, 그렇게 만들어보도록 합시다 !

먼저 라이트의 연산을 줄여봅시다. 

실시간 라이트(Realtime light)을 (Baked Light)로 바꾸어 베이킹을 하시게 된다면
라이트의 연산을 줄일 수 있답니다. (이는 Batches수치가 낮아짐=최적화)

밑에 사진처럼 월드안에 모든 라이트의 mode를 Baked Light로 바꾸어 봅시다.

팁. Window >Randering >Light Explorer을 이용하면 Hierarchy창에서 보지않고 해당 프로젝트의 모든 라이트와 모드를 볼 수 있습니다.

Baked Light 로 모드를 변경하셨다면, 월드의 모든 오브젝트(메쉬가 있는) 을 static체크를 해줍니다.

여기서 중요합니다. static체크는 더 이상 이 오브젝트는 움직이지 않는다 이기도 합니다.
말그대로 유동적인 오브젝트는 static체크을 하지 말아주세요. 
예 : VRC Pickup 컴포넌트가 들어간 오브젝트, 애니메이팅 된 오브젝트 그외 움직여야 되는 오브젝트 등등

static체크를 하셨고 라이트의 모드를 Baked Light 로 바꾸셨다면 
Window >Randering >Light setting 을 눌러 열어주세요.

여러가지의 설정들이 있습니다.
그대로 Generate Lighting 을 눌러 베이킹을 해도 됩니다만
개인적으로 Environment Lighting 쪽에 Source 를 Color나 혹은 Gradient로 바꾸셔서 밝게(흰색 추천) 수정해주세요.
현재 제 월드는 스카이박스가 어두운편이라서 밝게 수정해서 베이킹해야 
월드에 접속했을때 아바타가 검정색이 되는것을 방지할 수 있답니다.

베이킹을 완료했습니다만, 뭐가 엄청 비정상적으로 검정색이죠?
이럴때에는 static체크한 오브젝트에 FBX설정을 들어가 봅시다.

FBX설정을 들어갈 오브젝트를 선택 후 Mesh Filter에 있는 메쉬를 클릭합니다. 

누르게 되면 귀찮게 찿을 필요없이 바로 경로가 뜨게 됩니다.
마침 다른 오브젝트의 fbx도 다 모여있군요.

전부 선택 후 밑에 사진처럼 맨밑의 Generate Lightmap UVs 를 체크하여 줍시다. 

그리고, 베이킹을 다시 진행하면 밑에 사진처럼 정상적으로 베이킹이 완료됩니다.

그럼 한번 실행하여 Batches수치를 살펴볼까요?
20000에서 무려 600까지 내려왔습니다.
이정도만 해도 일반적인 월드최적화 입니다.

여기서, 라이트 베이킹의 단점이라면
유니티의 기본 라이트맵퍼의 성능은 나쁘지 않지만, 랜더링 시간과 그만큼 전기(자원)이 소모가 된다는점
입니다.

이단점을 줄여준 GPU라이트맵퍼가 있답니다.
https://assetstore.unity.com/packages/tools/level-design/bakery-gpu-lightmapper-122218

이 베이커리 라고 불리는 에셋은 베이킹의 시간을 효과적으로 단축시켜주는 갓에셋중 하나 입니다.
이것의 사용법은 다른 강의에서 소개해드리도록 하겠습니다. 

특수한 환경에 대응할 수 있는 극한의 최적화 방법(미리보기)

일반적인 월드에서 이정도의 최적화방식이 필요하지는 않습니다만, 
이벤트월드 나 각종 연회용 월드
특수한 환경(유저들의 접속이 많아야 되는 월드) 에서 사용하면 좋은 최적화 입니다.

일단 메쉬최적화 부터 준비해봅시다.

유니티에서 Window >Package Manager 을 들어가주세요.

FBX Exporter 을 찿아서 Install 해주세요.
모델을 추출하여 블렌더에 넣기위함 입니다.

두번째로 저희는 툴을 다운받아야 합니다.
https://www.autodesk.com/developer-network/platform-technologies/fbx-converter-archives

여기까지 준비가 되었다면, 다음편에서 Batches수치를 확인해가며,
무거운 메쉬 가볍게 줄이는 방법과 더불어 FBX의 용량을 줄이는 방법
텍스쳐를 유니티 압축을 통하지 않고 자체적으로 줄이는 방법 등

여러가지 일반적인 상황에서의 최적화가 아닌 극한의 최적화 방식을
소개시켜드리도록 하겠습니다.


이렇게 난잡한 글을 읽어주셔서 감사드리며, 궁금하신것이 있으시다면 Discord: steen#0265 로 문의주시면 감사드리겠습니다.