가비지 컬렉터(Garbage Collector)
가비지 컬렉터(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가 동작하여 정리
· 따라서 오브젝트 풀 활용, 선택이 아닌 필수!