C#에서의 메모리 할당과 해제는 주로 가비지컬렉터에 의해 자동으로 처리된다.
가비지 컬렉터는 더이상 사용되지 않는 객체를 자동으로 해제하는 기능을 말한다.
* 힙에 메모리 할당
* 참조되지 않는 객체 감지
* 해당 객체 메모리 해제
장점
단점
가비지컬렉터는 세 개의 세대로 나뉜다.
객체가 오래 남아있을 수록 더 높은 세대로 이동한다.
가비지컬렉터는 위와 같이 세대로 나누어 수집해는데 이는 생명주기의 특성을 활용하기에 유용하다. 생명주기가 짧은 객체들만 신속하게 수집하고 그렇지 않은 객체들은 적은 빈도로 수집해 시스템에 끼치는 영향을 감소시킬 수 있다.
객체 생성 최소화
객체를 자주 생성하고 파괴하면 리소스를 많이 잡아먹게 된다. 이를 방지하기 위해 주로 오브젝트풀 패턴을 활용해 생성과 파괴에 들어가는 리소스를 최소화한다.
큰 객체 할당 피하기
한번에 큰 메모리 블록을 할당하는 것은 부하를 줄수 있어 여러개의 작은 객체로 나누거나, 최소화 하는게 유리하다.
할당 패턴 최적화
작은 객체들을 일관되게 할당 및 해제하면 효율적으로 작동한다. 동적 배열을 가지는 List를 사용할 때는 예측 가능한 크기로 사전에 설정해 두는것이 유리하다.
박싱
박싱은 값 형식을 참조 형식으로 변환하는 과정으로 값 형식을 담을 수 있는 새 객체를 힙에 할당 후 힙에 할당된 객체로 복사된다.
언박싱
언박싱은 참조 형식이 실제로 값을 가지고 있는지 확인 후 힙에 있는 객체의 값을 스택 영역으로 복사한다.
Update는 매 프레임마다 호출되고 프레임에 따라 호출빈도가 바뀔 수 있지만 FixedUpdate는 물리엔진을 시뮬레이션 한 이후 고정된 간격으로 호출되며 호출빈도가 일정하다는 차이가 있다.
timeScale이0이 되면 Update메서드는 계속 호출되지만 시간 기반의 계산이 영향을 받는다.
FixedUpdate는 물리 엔진 업데이트를 위한 것으로 timeScale이 0이 되어도 호출되지만 물리 계산이 정상적으로 수행되지 않을 수 있다. 일정한 간격으로 호출되지만 물리 계산이 실제로 진행되지 않는다.
반대로 timeScale의 값을 늘려도 두 메서드의 호출 빈도는 변하지 않으며 시간 기반이나 물리 계산 부분에서는 영향을 받는다.
Awake는 객체 생성 시 가장 먼저 호출되며 활성화 될 때 자동으로 실행되고, 비활성화 이후 다시 활성화 해도 다시 실행되며 다른 스크립트의 초기화에 영향을 받지 않는다.
Start는 Awake 이후 호출되며 첫 프레임 업데이트 전에 한 번 호출된다.
OnEnable은 객체가 활성화 될 때마다 실행되며 Start보다먼저 실행된다.