-
게임 프로그래밍 패턴 Part 2 디자인 패턴 다시 보기 - 경량보관함 2020. 1. 27. 12:39
이 시리즈는 [게임 프로그래밍 패턴]에 등장하는 팁을 정리하고 패턴을 직접 구현하거나 구현되어 있는 패턴을 확인하는 것으로 해당 패턴에 대해 이해하는 것을 목표로 한다.
이번 포스팅에서는 Part 2의 두 번째 패턴인 경량 패턴을 살펴보고 유니티에서 어떻게 사용되었는지 파악하는 것을 목표로 한다.
경량 패턴이란?)
[GoF디자인 패턴]에서는 경량 패턴을 다음과 같이 소개했다.
공유(shring)를 통해 많은 수의 소립(fine_grained) 객체들을 효과적으로 지원합니다.
저자는 경량 패턴을 게임에서 숲을 그리는(렌더링하는) 것으로 설명했다.
가령 숲에 많은 수의 나무가 존재하는데 멀리에서 볼 때는 나무가 비슷해 보이므로 객체마다 렌더링 데이터(모델, 텍스처 등)를 가지고 있는 대신 하나의 렌더링 데이터를 공유하고 공유할 수 없는 정보(위치, 각도 등)은 객체별로 가지도록 하는 것이다.
이를 GPU 인스턴싱이라고 하며 그래픽 카드나 API에서 이 기능을 지원한다.
테스트 준비 및 목표)
이번 패턴은 유니티에서 어떻게 경량패턴을 적용하는지 확인하는 것을 목표로 한다.
먼저, 3D 빈 프로젝트를 생성하고 에셋 스토어에서 Meshtint Free Babarian을 검색해 임포트해준다.
이후 애니메이션이 동작하는 Legacy의 Prefab을 사용해 많은 수의 오브젝트를 생성한다.
애니메이션 컨트롤러는 다음과 같이 설정했다.
테스트 진행)
위에서 소개한 Prefab을 다음과 같이 배치하여 총 3,840개를 배치했다.
이 때 실행 결과는 다음과 같다.
이 상태에서 GPU 인스턴싱을 사용하도록 처리했으며 GPU 인스턴싱 적용 방법은 다음과 같다.
먼저, 해당 오브젝트에서 사용하는 매터리얼을 모두 선택한다.
이후 인스펙터 창에서 Enable GPU Instancing을 체크해준다.
적용한 결과는 다음과 같다.
이를 비교한 결과는 다음과 같다.
Batches가 상당히 감소한 것을 확인할 수 있는데 이를 통해 CPU의 오버헤드를 감소시킬 수 있다.
이에 대한 상세한 자료를 원하는 경우 Unity 메뉴얼 - GPU 인스턴싱을 참고하기 바란다.
결론)
유니티의 경우 객체를 그릴때 프리팹 등을 통해 어느정도 이를 이미 사용하고 있기에 GPU 인스턴싱 만으로는 큰 성능차이를 확인할 수 없었다. 다만 이미 유니티에 적용되어 있는 것이 성능 개선이 있다는 증거가 될 수 있다고 생각한다.
추가정보)
- 어떤 경량 객체가 실제로 필요할지를 예측할 수 없다면, 필요할 때 만드는 게 낫다.
- 객체 풀 패턴을 통해 미리 만들어 둔 경량 객체를 관리할 수 있다.
- 상태 패턴에 경량 패턴을 도입하는 경우 하나의 상태를 여러 객체에서 동시에 사용할 수 있다.