TECHARTNOMAD | TECHARTFLOWIO.COM

UNITY3D

Adaptive Probe Volume 데이터 스트리밍

jplee 2024. 10. 9. 03:56

2020년 중국 상해에 거점을 둔 거인네트웍(직원 3천명 규모로  30년 역사의 중견기업)에서 오픈월드 MMORPG 를 개발 할 때 사용했던 유니티 버전은 2019 쯤 됬던 것으로 기억합니다.
그 당시 라이트프로브 볼륨을 사용했었는데요... 큰 장면에서 메시브 하게 라이트프로브를 사용했을 경우 베이크 된 프로브 데이터 사이즈도 무시 못할 만큼 비대 해 졌습니다.
그래서 생각 했던 것이 어떻게 하면 스트리밍 할 수 있을지에 대한 것이었구요.
프로젝트 서포트 엔지니어링 부서와 함께 데이터를 스트리밍 하도록 개발하자는 것이었습니다.
어차피 라이트 프로브 그룹별로 생성 된 데이터를 따로 저장할 수 있는 API 가 존재 했고 그렇다면 플레이어 중심으로 충분히 프로브 데이터 그룹 셋을 스트리밍과 비슷하게 올리고 내릴 수 있다는 말이었으니까요. (주: 레이지 한 옥트리를 이용한 셀 공간을 구성 했던 듯... )
암튼 그래서 그 당시 중국 게임 개발사에서는 직접 라이트프로브 데이터를 핫로딩과 웜업 개념으로 관리 할 수 있는 시스템을 만들었구요.
월드가 가로 세로 각 32키로 대륙을 모바일 오픈월드로 만들었던 프로젝트였기 때문에 정말 많은 엔지니어링 공수가 들어갔던 기억이 납니다. 
그때 좀 느낀 점은... 유니티가 안되는건 없는데 다 만들어야 하는구나 였고 다음으로는 중국 엔지니어들이 드립다 안된다고 하지 않는 다는 점이었습니다.
이건 사설 이었구요.
유니티 6.0 의 적응형 라이트 프로브 역시 많은 우려는 데이터 사이즈 인데요... 다행히 스트리밍을 지원 합니다.
즉 데이터를 올리고 내리는 방식으로 관리 할 수 있다는 뜻입니다.
아직 세부적인 API 는 다 보지 않았고 소스코드 공개가 아니기 때문에 내부적으로 다 알 수 없지만 안될것도 없습니다.
유니티 2020 엔진소스를 볼 수 있기 때문에 당시 소스코드를 보면 LightProbes 에 스트리밍 구현은 되어 있지 않았었네요.

라이트프로브 데이터를 관리 할 일이 스트리밍 말고도 또 있었는데요.
T3 라는 게임을 개발할 때...
이건 거인 네트워크를 퇴사 하고 프로젝트 서포트 엔지니어링 부서 대장이랑 같이 이직 한 중국 게임회사 입니다. 탭탭 이라는 안드로이드 게임 서비스 플레폼을 운영하는 회사로 더 유명하긴 합니다.

T3 Arena

Download on App Store now: https://apple.co/3MOeT4F ALL-NEW HERO SHOOTER T3 Arena is an all-new, fast-paced hero shooter. Team up with your friends in 3v3 games, and battle in the Arena anytime, anywhere. Powerful heroes with their own personality, excitin

www.youtube.com

이 게임을 개발 할 때 배경 오브젝트 일부에 파괴 되는 시스템이 들어갔었어요.
벽돌 벽이라든가 난간 말이죠.
근데 이게 파괴가 되면 그곳의  SH 정보가 그대로  남아 있는게 종종 어색할 때가 있겠죠?
그래서 그때는 라이트프로브 그룹 고유 식별을 위한 값과 생성 된 프로브 인덱스를 런타임에서 관리 되도록 개발 했습니다.
그러니까 만약 배경 일부 오브젝트가 스테틱 이고 파괴 되어 사라졌다면 그에 해당 하는 프로브 인덱스의 SH9 정보로 저장 된 27개의 정보를 0으로 채워주도록 말이죠. 이후 상세한 고도화도 됬겠지만 베이스먼트 어프로치는 변하지 않았어요.

저는 딱 그렇게 처리 하자는 어프로치만 제공 했고 데이터 저장 라이브러리만 만들었어요.
 
암튼.... 아래 글은 이 토픽의 주된 내용인 적응형 라이트 프로브 스트리밍 최적화 입니다. 발췌는 유니티 공식 문서이고요.
이게 아직 한글화가 안되어 있어요.
대략 이해는 충분히 되도록 한글화 했으니 살펴 보도록 하면 좋겠네요. 유니티 6 으로 프로젝트 마이그레이션을 하면서 느끼는 점이라면 예전 구버전 유니티로 개발 할 때와 비교해서 스트리팅 쪽 개발이 많이 되었구나~ 라는 ... 생각이 들었습니다.


Optimize loading Adaptive Probe Volume data

런타임에 적응형 프로브 볼륨(APV) 데이터 로딩을 최적화하려면 다음 중 하나를 수행합니다:

  • APV 데이터를 스트리밍합니다.
  • 에셋 번들 또는 어드레서블에서 APV 데이터를 로드합니다.

두 가지 방법을 동시에 사용할 수는 없습니다.

APV 데이터 스트리밍

적응형 프로브 볼륨 스트리밍을 활성화하여 매우 큰 월드에서 적응형  프로브 볼륨 라이팅을 활성화할 수 있습니다. 스트리밍을 사용하면 사용 가능한 CPU 또는 GPU 메모리보다 큰 적응형  프로브 볼륨 데이터를 베이크하여 필요할 때 런타임에 로드할 수 있습니다. 런타임에카메라가 움직이면 유니버설 렌더 파이프라인 (URP)은 카메라의 뷰 프러스텀 내 셀에서 적응형  프로브 볼륨 데이터만 로드합니다. (역주: 카메라 프라스텀을 공간셀로 만들고 gpu light bake artist tool 을 저도 만든적이 있는데 어프로치는 유사 한듯 하네요)
유니티는 스트리밍 에셋을 사용하여 조명 데이터를 저장합니다. 유니티가 파일을 저장하는 위치에 대한 자세한 내용은스트리밍 에셋 을 참조하십시오. 
스트리밍을 사용하려면 다음 단계를 따르세요:

  1. 메인 메뉴에서편집 > 프로젝트 설정 > 품질 을 선택합니다 .
  2. 품질 수준을 선택합니다.
  3. 렌더 파이프라인 에셋을 더블 클릭하여 인스펙터에서 엽니다.
  4. 조명을 확장합니다 .

이제 두 가지 유형의 스트리밍을 활성화할 수 있습니다:

  • 디스크에서 CPU 메모리로 스트리밍하려면 디스크 스트리밍 활성화를 활성화합니다.
  • CPU 메모리에서 GPU 메모리로 스트리밍하려면 GPU 스트리밍 활성화를 활성화합니다. 먼저 디스크 스트리밍 활성화를 활성화해야 합니다.

같은 창에서 스트리밍 설정을 구성할 수 있습니다. 자세한 내용은 URP 에셋을 참조하세요.

스트리밍 디버그

URP가 로드하고 사용하는 가장 작은 섹션은 적응형 프로브 볼륨에서 가장 큰 브릭과 같은 크기인 셀입니다. 광원 프로브의밀도를 조정하여 적응형 프로브 볼륨의 셀 크기에 영향을 줄 수 있습니다.
적응형 프로브 볼륨의 셀을 보거나 스트리밍을 디버깅하려면렌더링 디버거 를 사용하세요. 

에셋 번들 또는 어드레서블에서 APV 데이터 로드

런타임에 필요한 APV 데이터만 로드하려면 베이크된 APV 데이터를에셋 번들 또는 어드레서블에 추가합니다.
다음 단계를 따르세요:

  1. 스트리밍 에셋 대신 일반 에셋에 APV 데이터를 저장하려면프로젝트 설정 > 그래픽 > 으로 이동합니다.파이프라인 특정 설정 > URP 로 이동한 다음적응형 프로브 볼륨 아래에서 프로브 볼륨 스트리밍 에셋 비활성화 를 활성화합니다 . 그러면디스크 스트리밍 활성화가 자동으로 비활성화됩니다 .
  2. 조명을 굽습니다.
  3. 씬을 에셋 번들에 추가합니다. 에셋 번들에 에셋을 추가하고 런타임에 로드하는 방법에 대한 자세한 내용은 에셋 번들워크플로 를 참조하십시오. 

프로브 볼륨 비활성화 스트리밍 에셋( ) 을 활성화하면  런타임에 APV가 사용하는 메모리 양이 증가할 수 있습니다. Unity는 모든 씬이 로드되었는지 여부에 관계없이 현재 베이킹 세트와 관련된 모든 조명 데이터를 메모리에 보관해야 합니다.