-
Object Pooling을 위한 Tool 제작게임 클라이언트 개발/MakeDNF 2024. 1. 11. 19:33
Unity에서 오브젝트를 생성(Instantiate)하거나 파괴(Destroy)하는 작업의 비용은 매우 크다. 따라서 게임 플레이 중 오브젝트를 많이 생성할 경우 해당 프레임의 연산량이 많아져 화면이 끊기는, 스파크 현상이 발생할 수 있다.
이를 해결하기 위해 오브젝트를 미리 생성해 놓고 필요할 때 가져다 쓰는 오브젝트 풀링(Object Pooling) 기법을 사용한다.
MakeDNF에서도 캐릭터가 이동하거나 스킬을 사용할 때 생성되는 이펙트나 투사체에 오브젝트 풀링 기법을 적용했다. 하지만 미리 생성한 오브젝트에 접근하기 위해 파라미터로 주로 String 타입의 변수를 사용했다.
// Spawn the object from the object pool by using the name of the prefab GameManager.ObjectPool.SpawnFromPool("Meteor_FireHero");
하지만 String 타입의 변수는 오타의 위험성이 있으며, String을 비교할 때마다 파라미터를 위한 새로운 메모리를 계속해서 할당해야 했기에 GC의 타겟이 된다는 문제점이 존재했다.
그래서 제한된 목록안에서 선택할 수 있고 GC의 타겟에서 벗어날 수 있는 Enum 타입으로 오브젝트에 접근할 수 있도록 Enum 스크립트를 작성해주고 Prefab을 관리하는 Tool을 작성했다.
새로운 데이터를 추가 및 제거가 가능하며 Prefab 오브젝트를 할당할 수 있다.
이후 데이터를 저장할 경우 템플릿 파일로 Enum 파일을 작성한다.
// EnumTemplate.txt (템플릿 파일) public enum $ENUM$ { NONE = -1, $DATA$ } // EObjectPoolList.cs (작성된 스크립트) public enum EObjectPoolList { NONE = -1, Fireball_1_FireHero = 0, Fireball_2_FireHero = 1, Meteor_FireHero = 2, Side_Flame_FireHero = 3, Flame_Strike_FireHero = 4, }
이렇게 String 변수를 사용하지 않고 Enum을 활용하여 Object Pool에 접근해 오브젝트를 가져올 수 있다.
// Spawn the object from the object pool by using the enum value of the prefab GameManager.ObjectPool.SpawnFromPool(EObjectPoolList.Meteor_FireHero);
해당 툴을 기반으로 비주얼 이펙트나 사운드 이펙트도 똑같이 Tool을 제작하여 사용하여 최대한 String 변수의 사용을 지양하고자 했다.
'게임 클라이언트 개발 > MakeDNF' 카테고리의 다른 글
애니메이션과 스킬 타이밍 동기화, 근데 AnimatorStateInfo를 곁들인.. (0) 2024.01.31 남 넨마스터의 넨가드 스킬에 대한 고찰 (0) 2024.01.22 Hitbox와 Hitbox Editor 개선 (0) 2024.01.11 Skill 시스템 구현 및 개선 (0) 2024.01.10 DNF Input System (0) 2023.12.11