본문 바로가기

Unity 공부시작

유니티 :: 오브젝트 풀링


기존의 오브젝트들을 생성하고 삭제하는 것에는 Instantiate() 와 Destroy를 통해 구현했다.


활, 총알 등과 같이 게임 내에서 자주 빠르게 생성되고 삭제되는 오브젝트들의 경우 하나하나 생성해주고 삭제해주는 것은


성능적으로 문제가 있다. 특히 메모리 상에서 오브젝트들이 생성되어있는데 삭제된 경우 ' Garbage ' 가 생성된다.


GarBage란 데이터를 저장하기 위해 따로 설정했다가 더 이상 사용하지 않는 메모리를 지칭하는 용어이다.


GarBage 컬렉션( GC ) 은 이러한 메모리를 재사용할 수 있도록 정리하는 '과정'을 나타내는 용어이다.


문제는, 이러한 GarBage 컬렉션이 자주 호출되게 되면 게임의 성능이 낮아지고 이는 소위 렉이 걸리는 것을 의미한다.




위에서 말한 문제들을 어느정도 해결해주는 방법 중 하나는 Pool을 만들어 필요할 때 꺼내 쓰고 다 쓰고 나면 다시 반납하는


'오브젝트 풀링'이다.  ( 학교 운영체제 시간에 배운 쓰레드풀이 생각난다 )


stack을 통해 구현하게 되면 미리 지정한 개수의 오브젝트들을 비활성화된 채로 만들어두고 필요할 때 pop()을 통해


사용하고 다 사용한 뒤에는 다시 stack에 push하는 형태로 이루어진다.


이를 통해 게임 처음에 생성한 후에는 복제와 삭제가 이루어지지 않으므로 게임의 성능을 높일 수 있다.





http://ronniej.sfuh.tk/optimizing-garbage-collection-in-unity-games-1/


위의 블로그를 참조했습니다 



* Garbage Collector : 힙 메모리에서 현재 사용되지 않는 메모리를 식별하고 이 메모리를 해제하는 역할


일정 기간마다 실행되어 힙 메모리를 청소한다.


Garbage Collection 과정


- Garbage Collector가 힙 상의 모든 오브젝트들을 검사한다.


- Garbage Collector가 오브젝트 참조 값을 모두 확인하여 해당 오브젝트가 힙 상에서 여전히 사용 중인지 확인


- 사용 중이지 않은 오브젝트들은 모두 삭제를 위해 flag로 표시를 해둔다.


- flag로 표시를 해둔 오브젝트가 삭제되면서 할당되었던 메모리가 힙에 반환된다.


* 따라서 오브젝트, 혹은 오브젝트 참조값이 더 많을 수록 처리할 일이 많아진다.



* 유니티는 두 가지 메모리풀에 대한 접근 권한을 가지고 있다.


1. 스택 ( Stack ) : 작은 단위의 데이터를 단기간 저장하는데 사용


2. 힙 ( Heap ) : 좀 더 큰 데이터를 장기간 저장하는데 사용