[유니티] 최적화 고민

sobokii·2024년 3월 28일
0

유니티

목록 보기
7/11

1. 문제 상황

디펜스류 게임을 제작 중이어서,
다량의 투사체와, 다량의 적 유닛이 등장해야만 함

2. 해결 방안

충돌 처리 완료 후, 화면 밖으로 나간 경우, 사망한 유닛 등 필요없어진 오브젝트들은 오브젝트 풀에 넣어주고, 필요시 다시 꺼내쓰기로 하였다. (오브젝트 풀링)
이를 통해 Instantiate, Destroy시 발생하는 오버헤드를 줄일 수 있다. (유니티에서는 인스턴스를 생성, 파괴하는 것에 많은 오버헤드가 발생

그리고 데이터 용량을 줄이기 위해 스크립터블 오브젝트를 사용하기로 했다.
스크립터블 오브젝트를 사용하면, 오브젝트 각각이 변수를 갖고 있는 것보다 용량 면에서 이득을 볼 수 있다. 그리고 더 중요한 것은 데이터를 중앙에서 관리할 수 있다는 점이다. (업데이트 등 유지 보수의 용이성)

현재는 아직 유지 보수나 데이터 변경 등의 이슈가 없으므로 체감하는 것을 써보자면 이렇다.
동일한 적 유닛이 100마리 등장한다고 가정해보자.
만약 오브젝트 넣을 공통 데이터 용량이 1MB라면, 100개의 오브젝트가 생기면 용량이 100MB 필요하다.
하지만 스크립터블 오브젝트를 활용하면, 100개의 오브젝트가 있어도 1MB의 용량만 있으면 된다.

3. 부가 지식 - 유니티는 왜 인스턴스 생성, 파괴시 많은 오버헤드를 발생시키는가?

메모리 할당 및 해제: 유니티에서 새로운 게임 오브젝트를 생성할 때마다, 해당 오브젝트와 그 구성 요소에 대한 메모리가 할당됩니다. 반대로 오브젝트를 파괴할 때는 할당된 메모리를 해제해야 합니다. 이러한 메모리 할당 및 해제 과정은 시스템 자원을 상당히 사용하며, 특히 게임 오브젝트가 많이 생성 및 파괴되는 상황에서는 오버헤드가 커질 수 있습니다.

가비지 컬렉션(Garbage Collection, GC): 유니티는 C#을 사용하며, C#은 관리되는 언어입니다. 이는 메모리 관리가 자동으로 이루어진다는 의미인데, 객체가 더 이상 필요 없을 때 가비지 컬렉터가 메모리를 자동으로 정리합니다. 인스턴스 생성 및 파괴가 빈번하게 일어나면, 가비지 컬렉션도 빈번하게 발생할 수 있으며, 이는 게임의 프레임률 저하로 이어질 수 있습니다.

초기화 및 종료 비용: 게임 오브젝트 및 컴포넌트는 생성될 때 초기화되고, 파괴될 때 종료 절차를 거칩니다. 이러한 초기화 및 종료 과정은 추가적인 CPU 시간을 요구할 수 있으며, 특히 복잡한 초기화 로직이나 리소스 로딩이 포함된 경우 오버헤드가 증가합니다.

씬의 변경: 인스턴스를 생성하거나 파괴할 때 유니티는 현재 씬의 상태를 업데이트해야 합니다. 이는 씬 내의 다른 오브젝트들과의 관계를 재구성하고, 필요한 경우 렌더링 정보를 업데이트하는 등의 작업을 포함할 수 있습니다. 이 과정에서 추가적인 처리가 필요할 수 있습니다.

네트워킹 및 동기화: 멀티플레이어 게임의 경우, 인스턴스 생성 및 파괴는 네트워크를 통해 다른 플레이어와 동기화되어야 합니다. 이 과정에서 네트워크 지연, 동기화 오류 처리 등 추가적인 오버헤드가 발생할 수 있습니다.

profile
직장 구하고 있습니다.

0개의 댓글