관리 메뉴

도드넷

유니티 오브젝트 풀링 테크닉 V2 - Advanced Object Pooling V2 본문

창고/게임 개발 [Hidden]

유니티 오브젝트 풀링 테크닉 V2 - Advanced Object Pooling V2

도드! 2020. 7. 28. 13:10




유니티 오브젝트 풀링 테크닉 V2

Dod's Advanced Object Pooling V2 



유니티 오브젝트 풀링에 대하여


총알, 피격효과, 특수효과를 소환할때 모두 반드시 [오브젝트 풀링] 기법을 사용해야한다.

그렇지 않으면 엄청난양의 총알, 특수효과 게임 오브젝트들이 씬에 가득 들어찰것이다. 

또 대량의 Instantiate & Destroy를 사용할 경우 GC와 메모리 문제가 발생할 수 있다.


오브젝트 풀링이란 간단히 말해서 "재활용" 이다.


기존에 내가 사용하던 오브젝트 풀링 기본 논리구조는 다음과 같다.


초기생산, 리스트생성 -> 리스트 쿼리 -> 소환(없으면 생성) -> 리스트에서 제거 -> 실사용 -> 

비활성화 -> 리스트에 다시 추가.



문제는 쿼리 부분이다.


만약 특수효과 리스트에 2000개의 특수효과가 준비되어 있다고 치자.


여기서 원하는 특수효과의 ID를 기반으로 간단한 for문을 돌려서 찾으면 순번이 앞일 경우 빨리 찾을수도 있지만 리스트 뒤에 있는경우 수많은 특수효과들을 일일히 전부 뒤져가며 해당 id의 특수효과를 찾아내야 해서 비효율적이다.


게다가 특수효과나 총알 같은경우 매우빠른 연사나 동시다발적으로 일어날 수 있는데 이는 프레임당 1회 혹은 2-3회까지도 가능하다. (기관총, 미니건, 다중의 총격전) 이렇게 되면 순간적으로 퍼포먼스에 매우 큰 지장을 줄 수 있다.


(10번만 돌려도 벌써 2만번의 대조가 일어난것이다.)



도드식 유니티 오브젝트 풀링 테크닉 V2


내가 생각해낸 해법은 Dictionary를 이용해서 분류하는 것이다.


이때 목표는

피격효과1(폭발), 피격효과2(피), 피격효과3(번쩍임) 각자 id별로 따로 자신만의 고유 List를 가지되,

쿼리는 id로 가능하게 만드는것이다.


바로 Dictionary<string, List<FX>> 형태의 리스트의 딕셔너리를 만드는 방법을 택했다.



일단 시작할때 FX(특수효과)의 id별로 분류해서 public dictionary (FX_Dic)를 작성한다. 


(start 인게임 함수여야함 에디터상 만들경우 안됨)


전체적 id 대조가 일어나지만 기존 오브젝트 풀링과 다르게 게임 시작 로딩시 1회만 작동한다.



풀러매니저의 특수효과 사용함수다.


 사용할 FX로 일단 딕셔너리(분류된형태)에서 리스트를 먼저 찾은후 거기서 사용할 FX를 찾는다.


1. 리스트 찾기


2. 리스트 맨위[0]번 사용하기(+리스트에서 제거), 

만약 없으면 만들어서 사용하기.


3. 활성화




사용이 끝나면 딕셔너리에 자신의 아이디로 접속해 자신에게 맞는 리스트에 스스로를 추가한다.


(재활용)












반응형
Comments