디펜스류 게임을 제작 중이어서,
다량의 투사체와, 다량의 적 유닛이 등장해야만 함
충돌 처리 완료 후, 화면 밖으로 나간 경우, 사망한 유닛 등 필요없어진 오브젝트들은 오브젝트 풀에 넣어주고, 필요시 다시 꺼내쓰기로 하였다. (오브젝트 풀링)
이를 통해 Instantiate, Destroy시 발생하는 오버헤드를 줄일 수 있다. (유니티에서는 인스턴스를 생성, 파괴하는 것에 많은 오버헤드가 발생
그리고 데이터 용량을 줄이기 위해 스크립터블 오브젝트를 사용하기로 했다.
스크립터블 오브젝트를 사용하면, 오브젝트 각각이 변수를 갖고 있는 것보다 용량 면에서 이득을 볼 수 있다. 그리고 더 중요한 것은 데이터를 중앙에서 관리할 수 있다는 점이다. (업데이트 등 유지 보수의 용이성)
현재는 아직 유지 보수나 데이터 변경 등의 이슈가 없으므로 체감하는 것을 써보자면 이렇다.
동일한 적 유닛이 100마리 등장한다고 가정해보자.
만약 오브젝트 넣을 공통 데이터 용량이 1MB라면, 100개의 오브젝트가 생기면 용량이 100MB 필요하다.
하지만 스크립터블 오브젝트를 활용하면, 100개의 오브젝트가 있어도 1MB의 용량만 있으면 된다.
메모리 할당 및 해제: 유니티에서 새로운 게임 오브젝트를 생성할 때마다, 해당 오브젝트와 그 구성 요소에 대한 메모리가 할당됩니다. 반대로 오브젝트를 파괴할 때는 할당된 메모리를 해제해야 합니다. 이러한 메모리 할당 및 해제 과정은 시스템 자원을 상당히 사용하며, 특히 게임 오브젝트가 많이 생성 및 파괴되는 상황에서는 오버헤드가 커질 수 있습니다.
가비지 컬렉션(Garbage Collection, GC): 유니티는 C#을 사용하며, C#은 관리되는 언어입니다. 이는 메모리 관리가 자동으로 이루어진다는 의미인데, 객체가 더 이상 필요 없을 때 가비지 컬렉터가 메모리를 자동으로 정리합니다. 인스턴스 생성 및 파괴가 빈번하게 일어나면, 가비지 컬렉션도 빈번하게 발생할 수 있으며, 이는 게임의 프레임률 저하로 이어질 수 있습니다.
초기화 및 종료 비용: 게임 오브젝트 및 컴포넌트는 생성될 때 초기화되고, 파괴될 때 종료 절차를 거칩니다. 이러한 초기화 및 종료 과정은 추가적인 CPU 시간을 요구할 수 있으며, 특히 복잡한 초기화 로직이나 리소스 로딩이 포함된 경우 오버헤드가 증가합니다.
씬의 변경: 인스턴스를 생성하거나 파괴할 때 유니티는 현재 씬의 상태를 업데이트해야 합니다. 이는 씬 내의 다른 오브젝트들과의 관계를 재구성하고, 필요한 경우 렌더링 정보를 업데이트하는 등의 작업을 포함할 수 있습니다. 이 과정에서 추가적인 처리가 필요할 수 있습니다.
네트워킹 및 동기화: 멀티플레이어 게임의 경우, 인스턴스 생성 및 파괴는 네트워크를 통해 다른 플레이어와 동기화되어야 합니다. 이 과정에서 네트워크 지연, 동기화 오류 처리 등 추가적인 오버헤드가 발생할 수 있습니다.