[펌] 유니티 엔진 - 오브젝트 풀 시스템

|

출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=1&sn1=&divpage=1&sn=on&ss=on&sc=on&keyword=%C0%AF%B4%CF%C6%BC&select_arrange=last_comment&desc=desc&no=280

·미리보기 | 소스복사·
  1. using System.Collections;  
  2.   
  3. using System.Collections.Generic;  
  4.   
  5.    
  6.   
  7. /* 
  8.  
  9.  * Usage 
  10.  
  11.  *  
  12.  
  13.  * CGameObjectPool<GameObject> monster_pool; 
  14.  
  15.  * ... 
  16.  
  17.  *  
  18.  
  19.  * // Create monsters. 
  20.  
  21.  * this.monster_pool = new CGameObjectPool<GameObject>(5, () =>  
  22.  
  23.     {  
  24.  
  25.         GameObject obj = new GameObject("monster"); 
  26.  
  27.         return obj; 
  28.  
  29.     }); 
  30.  
  31.      
  32.  
  33.      
  34.  
  35.     ... 
  36.  
  37.      
  38.  
  39.     // Get from pool 
  40.  
  41.     GameObject obj = this.monster_pool.pop(); 
  42.  
  43.      
  44.  
  45.     ... 
  46.  
  47.      
  48.  
  49.     // Return to pool 
  50.  
  51.     this.monster_pool.push(obj); 
  52.  
  53.  * */  
  54.   
  55. public class CGameObjectPool<T> where T : class  
  56.   
  57. {  
  58.   
  59.     // Instance count to create.  
  60.   
  61.     short count;  
  62.   
  63.       
  64.   
  65.     public delegate T Func();  
  66.   
  67.     Func create_fn;  
  68.   
  69.       
  70.   
  71.     // Instances.  
  72.   
  73.     Stack<T> objects;  
  74.   
  75.    
  76.   
  77.     // Construct  
  78.   
  79.     public CGameObjectPool(short count, Func fn)  
  80.   
  81.     {  
  82.   
  83.         this.count = count;  
  84.   
  85.         this.create_fn = fn;  
  86.   
  87.    
  88.   
  89.         this.objects = new Stack<T>(this.count);  
  90.   
  91.         allocate();  
  92.   
  93.     }  
  94.   
  95.       
  96.   
  97.     void allocate()  
  98.   
  99.     {  
  100.   
  101.         for (int i=0; i<this.count; ++i)  
  102.   
  103.         {  
  104.   
  105.             this.objects.Push(this.create_fn());  
  106.   
  107.         }  
  108.   
  109.     }  
  110.   
  111.       
  112.   
  113.     public T pop()  
  114.   
  115.     {  
  116.   
  117.         if (this.objects.Count <= 0)  
  118.   
  119.         {  
  120.   
  121.             allocate();  
  122.   
  123.         }  
  124.   
  125.    
  126.   
  127.         return this.objects.Pop();  
  128.   
  129.     }  
  130.   
  131.       
  132.   
  133.     public void push(T obj)  
  134.   
  135.     {  
  136.   
  137.         this.objects.Push(obj);  
  138.   
  139.     }  
  140.   
  141. }  
유니티 엔진에서 사용 할 수 있는 오브젝트 풀 스크립트 입니다.
c#으로 코딩했기 때문에 꼭 유니티가 아닌 프로젝트에서도 사용 할 수 있습니다.
모바일 게임을 만들다 보니 실시간으로 객체를 생성하는것이 굉장한 부담으로 다가오더군요.
그래서 이런 풀 시스템을 사용하여 미리 적당한 개수를 만들어 놓고 
꺼내오고, 넣어주고 하는 방법을 사용했습니다.

이걸 쓰기 전에는 몬스터가 나올때 마다 딜레이가 생겼었는데,
풀을 쓰고나니 처음에 로딩시간이 약간 더 걸린다는 단점이 있지만,
게임 플레이중에는 아주 쾌적하게 돌아가더군요.^_^)
더불어 메모리 사용량도 예측 가능하게 됐죠.

이 시스템을 사용하는 이유가 객체의 재사용 측면도 있지만,
그것보다는 객체 생성/해제시 딜레이를 없애준다는 점이 더 큰 성과인것 같습니다.

예제가 들어있는 패키지 파일은 첨부파일로 올렸습니다.
집에서 시간날때 만든것이고요, 소스코드 수정/배포/사용등은 사용하는 사람의 자유입니다.
시간없을땐 그냥 휙휙 긁어다가 사용해서 야근을 줄이세요~ㅎㅎ
더 좋은 방법이 있으면 댓글로 조언 남겨주시면 감사하겠습니다.



gameobjectpool.unitypackage


Trackback 0 And Comment 0