본문 바로가기
C#/Unity

Unity 성능 최적화: 정적 게임 오브젝트와 동적 게임 오브젝트의 적절한 사용법

by GangDev 2024. 4. 18.

정적 게임 오브젝트와 동적 게임 오브젝트

유니티에서 게임 오브젝트는 런타임 시점에 움직이는지 여부에 따라 정적 게임 오브젝트와 동적 게임 오브젝트로 분류된다.

 

정적 게임 오브젝트(Static Game Object):

런타임 시점에 움직이지 않는 게임 오브젝트를 말한다.

이러한 오브젝트는 게임 시작 시점에 위치가 고정되며, 게임 내내 움직이지 않는다.

예를 들어, 배경, 벽, 바닥 등이 정적 게임 오브젝트에 해당한다.

정적 게임 오브젝트는 에디터에서 미리 계산될 수 있으며, 이는 런타임 시점에도 유효하기 때문에 게임의 성능을 향상시킬 수 있다.

 

동적 게임 오브젝트(Dynamic Game Object):

런타임 시점에 움직이는 게임 오브젝트를 말한다.

이러한 오브젝트는 플레이어의 행동, AI의 행동, 물리 상호작용 등에 의해 위치, 회전, 크기 등이 변경될 수 있다.

예를 들어, 플레이어 캐릭터, AI의 행동, 물리 상호작용 등에 의해 위치, 회전 크기 등이 변경될 수 있다.

예를 들어, 플레이어 캐릭터, 적 캐릭터, 물체 등이 동적 게임 오브젝트에 해당한다.

동적 게임 오브젝트는 게임 내내 상호작용이 발생할 수 있으며, 이에 따라 게임의 다양한 요소가 변화한다.

 

정적 게임 오브젝트와 동적 게임 오브젝트의 구분은 게임의 성능 최적화와 관련이 있다.

정적 게임 오브젝트는 미리 계산될 수 있어 런타임 시점에 계산 부담을 줄일 수 있으며, 이는 게임의 전반적인 성능을 향상시킬 수 있다.

반면, 동적 게임 오브젝트는 게임 내내 상호작용이 발생하므로, 이러한 상호작용을 효율적으로 처리하는 것이 중요하다.

이를 위해 유니티는 다양한 최적화 기법을 제공하며, 개발자는 게임의 요구 사항에 맞게 정적 및 동적 게임 오브젝트를 저절히 사용하여 게임의 성능을 관리해야 한다.

 

정적 게임 오브젝트를 사용한 최적화 기법

 

Static Batching:

여러 정적 오브젝트를 하나의 큰 오브젝트로 결합하여 렌더링 비용을 줄일 수 있다.

이는 게임 오브젝트의 메시를 미리 계산하고, 런타임 시점에 이를 효율적으로 렌더링하는 데 도움이 된다.

 

Occlusion Culling:

정적 오브젝트를 사용하면, 카메라의 시야에 벗어난 오브젝트를 자동으로 제외하여 불필요한 렌더링 비용을 줄일 수 있다.

이는 게임의 렌더링 성능을 향상시키는 데 중요한 역할을 한다.

 

Lightmapping:

정적 오브젝트는 라이트맵을 사용하여 조명을 미리 계산할 수 있다.

이는 런타임 시점에 조명 계산 비용을 줄이고, 게임의 시각적 품질을 향상시킬 수 있다.

 

Navigation:

정적 오브젝트는 네비게이션 시스템에서 사용되어, AI 캐릭터가 장애물을 효율적으로 피하는 데 도움이 된다.

이는 게임의 AI 성능을 향상시키는 데 중요한 역할을 한다.

 

정적 게임 오브젝트를 사용할 때 주의할 점:

정적 게임 오브젝트를 사용하면 메모리 사용량이 증가할 수 있으며, 특히 대규모 게임에서는 빌드 시간이 길어질 수 있다.
따라서, 정적 게임 오브젝트를 사용할 때는 게임의 요구 사항과 성능 요구 사항을 고려하여 적절히 사용해야 한다.

 

동적 게임 오브젝트를 사용한 최적화 기법

Dynamic Batching:

동적 게임 오브젝트에 대해 유니티는 동일한 재질을 공유하는 오브젝트를 함께 배치(batch)하여 렌더링 성능을 향상시킨다.

이는 메시가 900개 미만의 정점 속성을 가진 경우에만 적용되며, 쉐이더가 정점 위치, 노말, 단일 UV를 사용하는 경우 최대 300개의 정점을 배치할 수 있다.

또한, 반사 계산이나 다른 물리 계산을 최소화하고, 레이어 마스크를 사용하여 특정 레이어의 오브젝트만 감지하도록 설정하는 등의 방법으로 성능을 최적화할 수 있다.

 

LODs(Levels Of Detail):

거리에 따라 오브젝트의 메시를 다양한 레벨로 분할하여, 멀리에서 보일 때는 더 낮은 다큐멘테이션의 메시를 사용하고, 가까이에서 보일 때는 더 높은 다큐멘테이션의 메시를 사용하는 기법이다.

이는 메모리 사용량을 줄이고, 렌더링 성능을 향상시킬 수 있다.

 

MipMaps:

텍스처의 해상도를 카메라로부터의 거리에 따라 줄이는 기법이다.

이는 텍스처의 해상도를 줄이는 것이 아니라, 해상도가 낮은 텍스처를 사용하여 메모리 사용량을 줄이고, 렌더링 성능을 향상시킬 수 있다.

 

Physics Calculations:

물리 계산을 최적화하기 위해, 필요한 경우에만 충돌체(Collider)를 사용하고, 메시 콜라이더 대신 기본 형태의 콜라이더를 사용하는 것이 좋다.

또한, 레이캐스트(Raycast)를 효율적으로 사용하여 필요한 오브젝트만 감지하도록 하고, 레이캐스트 대상을 제한하는 레이어 마스크를 활용하는 것도 주용하다.

 

Culling:

카메라의 시야에 벗어난 오브젝트를 자동으로 제외하여 불필요한 렌더링 비용을 줄이는 기법이다.

이는 게임의 렌더링 성능을 향상시키는 데 중요한 역할을 한다.

 

정적 게임 오브젝트를 사용하는 것이 비효율적인 예시

* 자주 움직이는 오브젝트:

정적 게임 오브젝트는 런타임 시점에 움직이지 않는 오브젝트를 의미한다.

따라서, 플레이어의 행동, AI의 행동, 물리 상호작용 등에 의해 위치, 회전, 크기 등이 자주 변경되는 오브젝트에 정적 게임 오브젝트를 사용하는 것은 비효율적이다.

이러한 오브젝트는 동적 게임 오브젝트로 설정하여, 게임 내내 상호작용이 발생하는 것을 효율적으로 처리할 수 있다.

 

* 빈번한 오브젝트 업데이트:

정적 게임 오브젝트는 런타임 시점에 변경되지 않는 것으로 간주된다.

따라서, 오브젝트의 상태가 빈번하게 변경되는 경우(예: 텍스처 변경, 색상 변경 등)에도 정적 게임 오브젝트를 사용하는 것은 비효율적일 수 있다.

이러한 경우, 동적 게임 오브젝트로 설정하고, 필요한 경우에만 상태를 업데이트하여 성능을 최적화할 수 있다.

 

* 많은 오브젝트 수의 관리:

정적 게임 오브젝트를 사용하면, 게임 시작 시점에 모든 오브젝트의 정보가 미리 계산되어야 한다.

이는 게임의 빌드 시간을 길어지게 만들 수 있으며, 특히 대규모 게임에서는 성능에 부정적인 영향을 끼칠 수 있다.

따라서 게임 내의 오브젝트 수가 많을 경우, 동적 게임 오브젝트를 사용하여 필요한 오브젝트만 관리하고, 불필요한 오브젝트는 정적 게임 오브젝트로 설정하는 것이 효율적일 수 있다.

 

동적 게임 오브젝트를 사용하는 것이 비효율적인 예시

* 매우 적은 오브젝트 수의 관리:

동적 게임 오브젝트는 런타임 시점에 움직이는 오브젝트를 의미한다.

따라서, 게임 내에서 움직이는 오브젝트의 수가 매우 적을 경우, 동적 게임 오브젝트를 사용하는 것은 비효율적일 수 있다.

이러한 경우, 정적 게임 오브젝트를 사용하여, 게임의 성능을 최적화하고, 불필요한 렌더링 비용을 줄일 수 있다.

 

* 변경이 거의 없는 오브젝트:

동적 게임 오브젝트는 상태가 자주 변경되는 오브젝트를 의미한다.

따라서, 오브젝트의 상태가 거의 변경되지 않는 경우, 동적 게임 오브젝트를 사용하는 것은 비효율적일 수 있다. 이러한 경우, 정적 게임 오브젝트를 사용하여, 게임의 성능을 최적화하고, 불필요한 렌더링 비용을 줄일 수 있다.

 

* 매우 복잡한 오브젝트 구조:

동적 게임 오브젝트는 런타임 시점에 상호작용이 발생하는 오브젝트를 읨히ㅏㄴ다.

따라서, 오브젝트의 구조가 매우 복잡하고, 상호작용이 많은 경우, 동적 게임 오브젝트를 사용하는 것은 비효율적일 수 있다.

이러한 경우, 정적 게임 오브젝트를 사용하여, 게임의 성능을 최적화하고, 불필요한 렌더링 비용을 줄일 수 있다.