[디지털 트윈] WebGL 상에서 대규모 시뮬레이션을 하려면?
요즘 디지털 트윈 플랫폼 사업이 인기가 많은 것 같습니다.
산업, 데이터, 의료 등
많은 기업들이 도전하고 있는 분야 같은데요.
그동안 유니티하면 대부분 게임 개발자이고,
이쪽 산업으로 유입되면서 필요한 스펙이 무엇인가 알아야 할 것 같습니다.
쉽게 생각하면 데이터 맵핑하고 UI에 정보를 띄우고, 카메라를 확대해서 이리저리 둘러보는 것이지만
좀 더 깊은 방향으로 접근한다고 하면, 게임 로직 제어보다는 최적화나 API 연동, 웹 개발자와 협업 능력이 중요하게
느껴집니다.
대규모 단지나 지역 그리고 Crowd Simulation / Traffic Simulation
이런, 대규모 대형 월드의 시뮬레이션을 위해 필요한 기술은 무엇일까?
쉬운 방법부터 하드하게 접근할 방법까지 열심히 찾아봤습니다.
유니티에서 업로드한 영상
https://www.youtube.com/watch?v=3mSO1sMdGxM
https://www.youtube.com/watch?v=eIbOLzkeMro
유니티에서는 정말 좋은 영상들을 올려주고 있어서
많이 참고하는 편인데요.
슬프게도 WebGL 타겟팅이 아니라 모바일 플랫폼을 타겟으로 하고 있어서
강조하고 또 강조하는 기술들이 WebGL에서는 동작하지 않는 경우가 많습니다.
게임 오브젝트처럼 단순하게 Instantiate 했다가는 1000개 밖에 안 만들었는데
결국, DrawCall을 줄이는걸 최대한 목표로 해야합니다..
버벅이면서 WebGL은 커녕 PC에서도 구동조차 못할 수 있습니다.
0. Occulsion Culling
슬프게도 대규모 시뮬레이션에는 아무짝도 쓸모없는 기능입니다.
카메라를 확대하면서 실시간으로 FPS가 좋아지는 기쁨(?)은 볼 수 있겠죠.
1. Texture 퀄리티 줄이기
최대한 많은 Object들을 볼 수 있는걸 목표로 한다면,
가장 쉬우면서도 효과적이라고 할 수 있습니다.
불행히도, 찌그러지고 망가지고 지저분해보이는 빌딩들을 고객들이 만족할 수 있다면 말이죠.
2. 오브젝트 Vertics 줄이기
Low-Poly 라는 말을 많이 들어보셨을 겁니다.
오브젝트마다 가지고 있는 Vertex를 최대한 줄이고, 최적화하는 과정은
Texture와 마찬가지로 보기에는 퀄리티가 떨어질 가능성이 있지만,
Texture보다는 덜 티가 난다는게 장점인 것 같습니다.
3. ECS 활용하여 Object 관리
최근에 ECS/DOTS에 크게 관심을 가지면서 계속 알아봤습니다.
불행히도 WebGL에서는 DOTS의 핵심 기술인 Burst Compiler와 Job System이 동작하지 않습니다.
그래도 ECS 자체는 적용 가능하기 떄문에,
대규모 오브젝트들을 다룰 때는, 일반적인 MonoBehaviour 보다는 성능상에서 이점이 있습니다.
하지만.. 이 방식은 결국 Rendering 에서 발생하는 부하를 대체해주지는 못합니다.
무작정 Instantiate해보고, 프로파일러를 동작시켜보면
DrawCall 이 전체 성능 저하의 80% !! 를 차지합니다.
ECS를 적용해서 이득 볼 프레임이 10FPS 이내인 것이죠..
4. Graphics API 활용하기. (GPU Instancing)
이 방법이 그나마 적용하기 쉽고 좋은 방법 같습니다.
후술할 하드한 방법보다 훨씬 효과적이고 안정적일 겁니다.
하지만... 비교적 쉽다고는 하지만 그래도 각잡고 공부하다보면
GL 코드 화면과 손에 PBR 책이 들려있는 개발자의 모습을 볼 수 있습니다. (제가 그렇습니다.)
5. ECS + Graphics API 활용하기.
사실 상 일반적인 개발자 수준에서는
최상의 노력을 한 것 일 겁니다.
(사장님들은 힘껏 칭찬해주세요.)
6. Native PlugIn 사용하기.
사실 시뮬레이션 쪽을 알아보기전에 이런게 있는줄도 몰랐네요.
WebGL에서 최대한의 렌더링을 사용하기 위한 (요청받은 개발자한테는) 최악의 방법입니다.
Native PlugIn 을 이용해서 모든 Rendering 처리를 외부에서 진행하며 Multi-Thrading 까지 활용하여
Unity를 렌더링 머신으로 쓰는 방법입니다.
7. Native Plug-In 사용을 극대화하기.
제가 찾았던 어느 솔루션에서 적용한 기술입니다.
RUST 개발 언어로 만들어진 Multi-Threading 사용 가능한 Unity ECS Machine을 Native Plugin으로 가져와서
ECS + Graphic 처리를 하는 방식입니다.
해당 솔루션은 WebGL 에서 10만 오브젝트를 60fps로 애니메이션이 자연스럽게 동작하도록 구현했습니다.
문제는 Native Plugin 은 외부에서 엔진을 끌어다 쓰는거기 떄문에, 보안 이슈가 크게 있다고 합니다.
제한적인 상황이 아니라면 비추천한다고 하네요.