[UE5] 언리얼5 C++ - Object Pooling 시스템 최적화

AnJH·2024년 7월 15일
0

Object Pooling System 최적화

Object Pooling 이라는 게 아무래도 많은 양의 객체가 Spawn되는 것이기에 이때 메모리 문제를 생각하지 않을 수 없다.

Spawn과 Destroy를 할 때 발생하는 프레임드랍을 막기 위해 사용하는 것인데, 객체가 Spawn되어 있는 상태만으로 프레임이 떨어진다면 Object Pooling을 사용하는 의미가 없기 때문이다.

이때 대표적으로 생각할 수 있는 것이 LOD와 Collision이다.

  • LOD
    LOD라는 것은 Level Of Detail의 약자로 쉽게 설명하자면 거리에 따라 렌더링을 다르게 하는 것이다.
    Player와 객체의 거리가 멀다면 Player는 해당 객체가 매우 작게 보이기에 작은 디테일까지 렌더링을 하지 않아도 전혀 문제가 되지 않는다.
    반대로 매우 가깝더라도 디테일이 너무 강조되지 않아도 되거나 어느정도 퀄리티가 낮아지는 것을 감수하더라도 최적화를 하기 위해 최소 LOD를 높이는 방안도 있다.

    위 옵션은 Skeletal Mesh의 Asset Details 옵션이다.
    Minimum LOD를 올릴수록 Mesh의 퀄리티는 낮아지지만 Triangle과 Vertices의 수가 낮아지기에 메모리 최적화에는 큰 도움이 된다.

  • Collision
    Mesh에 적용되어 있는 Collision은 메모리에 많은 영향을 준다.
    아래 사진은 Mesh에 적용되어 있는 Collision의 하나의 예시이다.

    해당 Mesh는 Collision이 상당히 많은 부분으로 나눠져 있다.
    이런 Mesh가 한 개가 Spawn되는 것이야 전혀 문제가 되지 않지만 Object Pooling 방식을 사용하기 위해 이를 사용했다면 많은 양이 Spawn될 것이기에 메모리에 큰 부담이 된다.
    이때는 여러가지 해결방안이 있지만 가장 간단한 것은 Mesh의 Collision을 NoCollision상태로 만드는 것이다.
    이를 Character Class로 생성할 경우, Capsule Collision이 기본적으로 사용되기에 Mesh의 Collision을 끄더라도 크게 문제가 되지 않는다.
    위 방법이 아닌 Collision을 조금이라도 부위별로 나누고 싶다면 Mesh의 Collision을 없애고 새로 만들어주는 방법도 있다.
    허나 이 방법을 사용할 경우, 위 사진과 같이 세부적으로 Collision을 나누게 된다면 메모리에 부담이 가는 것은 여전할 것이니 개발하는 환경에 맞춰 최적의 방안을 선택해야 할 것이다.

0개의 댓글