본문 바로가기
그래픽/Unity

[Unity ECS] 내가 Unity ECS를 시작한 이유

by jod2 2023. 8. 17.
반응형

회사에서 동일한 나무 모델을 한 View에 20만개 정도 띄워야 하는 요구사항이 있었다. RTS환경의 오픈월드 시뮬레이션 프로그램을 만들려는데 줌이 멀어지면 한 화면에 나무들이 너무 많이 보이기 때문에 이를 처리하기 위한 방안을 모색하기로 했다.

 

위의 요구사항을 만족하기 위해 처음에는 GPU Instancing을 이용해서 구현을 했으나 GPU Instancing을 하게 되었을 때 아래의 한계점이 보였다.

1. GPU Instancing에 LOD를 적용하게되면 서로 다른 Material이라 인식하여 오히려 성능이 떨어는 현상 발생.

2. GPU Instancing이라고 해도 한번의 드로우 콜로 최대 1023 까지 하나의 드로우콜로 사용가능하므로 20만개를 사용하는 경우에는 드로우 콜이 여러번 발생함.

 

 

위와같은 문제가 발생하여 여러가지 대안을 찾아 보던중에 2가지 대안을 찾아냈다.

> 이런 요구사항을 해결하기 위해 생각할 수 있는 여러 방법들과 한계가 아래 링크에 잘 정리되어 있지만 내가 찾은 방법에 대해서 글을 쓴다.

> 참고)

https://github.com/GeorgeAdamon/ways-to-render-1M-cubes

 

GitHub - GeorgeAdamon/ways-to-render-1M-cubes: All the ways to efficiently render 1 Million cubes in Unity3d (I could think of).

All the ways to efficiently render 1 Million cubes in Unity3d (I could think of). - GitHub - GeorgeAdamon/ways-to-render-1M-cubes: All the ways to efficiently render 1 Million cubes in Unity3d (I c...

github.com

 

첫번째는 Indirect Drawing 기법으로, opengl이나 directx에서도 사용하는 기능인데, CPU에서 렌더링에 필요한 연산을하여 GPU에 전달하는 기존 방식과는 달리 GPU에서 바로 렌더링 연산을 하여 렌더링 하는 것이다. 이 방법을 쓰면 CPU와 GPU 사이의 드로우 콜이 현저하게 줄어들 수 있다. 하지만 LOD, 그림자 처리, Occlusion Culling, Frustum Culling 등과 같은 처리는 Compute Shader로 별도 처리를 해주어야 하기 때문에 난이도가 꽤 있는 기술이다. 잔디와 같은 간단한 Geometry라면 이 방법을 사용했을 것 같지만 나무 모델은 생각보다 복잡하기 때문에 이 방법을 사용할 자신이 없었다.

 

아래 두 오픈소스 프로젝트에서는 이 방법을 사용하여서 요구사항을 해결하였다.

https://github.com/Milk-Drinker01/Milk_Instancer01

https://github.com/ellioman/Indirect-Rendering-With-Compute-Shaders

 

GitHub - ellioman/Indirect-Rendering-With-Compute-Shaders: An example of drawing numerous instances using Unity3D, compute shade

An example of drawing numerous instances using Unity3D, compute shaders and Graphics.DrawMeshInstancedIndirect with Frustum & Occlusion culling and LOD'ing. - GitHub - ellioman/Indirect-Ren...

github.com

추가로, GPU Instancer라는 유료 에셋이 있지만 GPU Instancing을 Runtime에서 제공하지 않아 사용하지 않았다.

 

두번째로는 Unity에서 새로운 방향성으로 제시한 Unity ECS이다. 기존 OOP로 짜여있던 MonoBehavior에서 행위와 상태를 분리하여 ECS로 관리하는 방식의 새로운 패러다임이라고 한다. 마인크레프트나 오버워치에서도 최적화로 사용했다고 하니 실제로 적용 가능하다고 판단하여 공부를 시작하고자 한다. 아래와 같은 프로젝트를 만드는 것이 최종 목표이다.

출처) https://www.youtube.com/watch?app=desktop&v=ekRFu5bxouw 

마지막으로 ECS 공부는 https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/EntitiesSamples와 ECS 공식문서를 보고 진행할 예정이다.

반응형

댓글