Unity/Optimization

가비지 컬렉터(Garbage Collector)

WeMakeJoy 2015. 12. 29. 02:02

가비지 컬렉터(GC)


· Mono의 동적 메모리 관리 때문에, 메모리 해제를 위해 GC가 자동 호출


· GC는 언제 일어날지 모른다


· GC가 일어나면 렉이 발생함


· 동적 메모리 해제가 가능한 일어나지 않게 해야 하는게 GC 관리의 핵심


· 문자열 병합은 String + String(임시 문자열 생성) 대신 StringBuilder.Append() 함수 사용


· 문자열 비교할 때 bool string.Equals(string a, string b) 함수를 사용한다.


· 일반 array에 한해서 foreach 대신에 for문 사용

 - forach 한번 돌 때마다 24byte의 쓰레기 메모리 생성, 속도도 for문보다 느림


· for문으로 루프문 작성 못할 경우 enumerator를 쓴다.


· 태그 비교에는 compareTag() 사용 (ex> go.compareTag(“enemy”))

 -if (go.tag == “enemy”)는 추가 메모리를 할당하고, 복사


· 데이터 타입에는 Class 대신 구조체 사용

 - 구조체는 GC에 들어가지 않고 Stack에 할당


· 즉시 해제할 때는 Dispose 수동 호출

 - 오브젝트의 dispose를 수동으로 호출하여 즉시 cleanup


· 임시 객체들을 만들어내는 API들을 조심

 - ex> GetComponents<T>, Mesh.Vertices, Camera.allCameras, etc...


· int -> string으로 파싱할 땐 입맛에 따라 사용한다.

  - integers[i].ToString(), System.Convert.ToString(integers[i])


· string -> int는 tryParse를 사용한다.

  - int.TryParse(strs[i], out integer)


· 콜백함수에 빈 delegation을 작성하지 않는다. callback을 받는 부분에선 무조건 null 체크를 하고, null을 인자로 작성한다.


· Debug.Log는 여러면에서 엄청난 비용을 차지 -> 빌드 시 출력하지 않게 한다.

 - 보안상, 프로그램 성능상 출력을 필수로 막아야 한다.




오브젝트 풀링


· 오브젝트 or 프리팹의 동적 생성과 해제는 부하 큼


· 오브젝트가 해제되면, GC가 동작하여 정리


· 따라서 오브젝트 풀 활용, 선택이 아닌 필수!