유니티 메모리 관련 정리 글 링크 입니다.
http://unityindepth.tistory.com/9
아래는 위 링크를 기반으로 정리한 것입니다.
변수는 스택에 저장된다.
new로 생성된 객체는 힙에 저장된다.
힙에 저장되는 형식은
class
object
string (string은 변수가 아닌 Class String이다.
가비지 컬렉션
1. 가비지 컬렉션은 시스템이 연산을 위해 메모리가 충분치 않다고 판단될 때 일어난다.
> 버려진 객체가 상당한 기간 동안 수거되지 않을 수 있다.
2. 가비지 컬렉션은 매우 비싼 연산이다.
>레벨 로드, 일시정지 등에서 수동적인 가비지 컬렉션을 작동시키는 것이 좋다.
> System.GC.Collect(); 명령어를 통해 수동으로 가비지 컬렉션을 작동시킬 수 있다.
3. 스택에 할당된 값에는 일어나지 않는다. 즉 Class는 가비지 컬렉션이 일어나지만, 구조체는 일어나지 않는다.
값 전달
1. =, 함수의 인자로 값을 전달할때 스택에 할당된 메모리가 복사된다.
2. int a = int b 일 때 b에 할당된 값이 a에 복사된다.
3. class a = class b 일 때는 스택에 할당된 a와 b의 힙 메모리 주소가 복사된다.
클래스 vs 구조체
1. 클래스는 참조 타입이고(힙에 할당되며, 힙의 메모리 주소는 스택에 저장된다.)
2. 구조체는 값 타입이다.(스택에 할당된다.)
3. 구조체는 값에 의한 전달이기 때문에 =, 인자로 값을 전달할 때 메모리가 증가한다.
4. 클래스에 의한 전달은 힙에 생성된 객체를 스택에서 메모리 주소로 할당되어 있기 때문에 메모리가 주소값을 저장하는 변수의 크기만큼만 늘어난다.
5. 클래스는 메모리를 절약하지만, 속도는 값이 스택에 저장되는 구조체가 빠르다.
6. 그러나 구조체의 데이트가 거대할 경우, 복사하는 시간이 걸리기 때문에 이 부분도 고려해야 한다.
7. 구조체는 가비지 컬렉션을 유발하지 않는다.
8. Vector3, RayCastHit은 자주 할당되고 오래사용하지 않기 때문에 구조체로 되어 있다.
9. 물론 ref, out을 사용하여 구조체의 값을 참조하여 변화시킬 수 있다.
스태틱
1. .Net의 정적 변수는 High Frequency Heap라고 불리는 Heap의 특별 공간에 저장된다.
정적 클래스
1. 오직 하나의 객체(사용하기 위한)만을 힙에 할당한다.
2. 다른 객체는 만들 수 없다.
3. 객체의 생성은 첫번째 호출에서 생성되며, 프로그램이 끝날 때 파괴된다.
> Scene이 종료되도 파괴되지 않기 때문에 사용 시 주의해야 한다.
> 여러씬에서 사용되는 클래스를 정적으로 만드는 것이 좋다.
> 객체 생성이 첫번째 호출에서 생성되기 때문에, 호출되지 않는 정적 클래스는 객체를 만들지 않는다.
정적 변수
1. 객체안의 정적 변수는 객체가 아닌 클래스에 속해있다.
2. 객체가 생성될 때 할당되지 않으며, 호출될 때(정적 클래스와 마찬가지로) 객체화 된다.
3. 즉 모든 객체안의 정적변수 객체는 단 하나이며 모든 객체는 이 클래스에 속한 정적 변수를 공유한다. (하나의 객체에서 값을 변경하면 다른 객체도 영향을 받는다. 힙에 할당되어 스택의 메모리 주소만 공유하기 때문)
4. 당연히 씬이 파괴되더라도 이 정적 변수는 살아있다.(정적 객체는 프로그램이 종료될 때 파괴된다.)
정적 함수
1. 일반 클래스에서 구현할 수 있다.
2. 단 정적 함수에 사용하는 변수는 정적 변수이어야 한다.
힙 파편화
1. 힙은 데이터가 무작위로 저장되어 있는 거대한 메모리 공간이다.
2. 유니티에서는 .Net managed 메모리를 사용하기 때문에 C처럼 파편화 현상이 일어나지 않지만 공간을 확보하기 위한 가비지 컬렉션의 과도한 사용은 절대로 효율적이지 않다.(버벅거림)
오브젝트 풀링
1. 오브젝트의 생성 제거에 의한 힙 파편화에 의한 과도한 가비지 컬렉션 사용을 막기위해 사용된다.
2. 재사용될 객체(총알, 몬스터, 이펙터 등)를 파괴하지 않고 비활성 시켜 놓는다.
> Instanitate와 Destroy를 사용하지 않아도 된다!!
댓글 없음:
댓글 쓰기