ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 오브젝트를 할당할 수 있다.

    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 변수의 사용을 지양하고자 했다.

Designed by Tistory.