게임 클라이언트 개발/MakeDNF

Object Pooling을 위한 Tool 제작

재호맴매 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 오브젝트를 할당할 수 있다.

Object Pool Tool 화면

 

이후 데이터를 저장할 경우 템플릿 파일로 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 변수의 사용을 지양하고자 했다.