유니티 작동 순서

2024. 10. 25. 21:52카테고리 없음

1. Unity 엔진 초기화

- 프로그램 실행 시, Unity 엔진이 처음 로드될 때 필요한 시스템 자원들이 메모리에 로드됩니다.

- 메모리에서는 코드와 엔진 코어가 스택과 힙으로 나누어 메모리에 할당됩니다.

  • 스택 메모리는 주로 함수 호출, 지역 변수 저장 등에 사용되고, 호출이 끝나면 바로 해제됩니다.
  • 힙 메모리는 동적으로 할당되는 데이터(예: 오브젝트 인스턴스, 대형 배열 등)에 사용되며, 메모리에 할당된 상태를 지속적으로 유지해야 하는 경우 사용됩니다.

2. 씬 로드

- 게임을 실행하면 첫 번째로 로드할 씬 SceneManager에 의해 메모리로 올라옵니다.

- 씬은 크게 세 가지 영역으로 나눠 메모리에 로드됩니다:

  • Static 메모리: 씬 내에서 변하지 않는 자원, 예를 들어 텍스처, 오디오 클립 등이 여기서 로드됩니다. 이 데이터는 힙 메모리에서 할당되고, 씬 전환이 있을 때마다 필요에 따라 해제되거나 재할당됩니다.
  • Scene-Specific 메모리: 씬 내의 오브젝트와 관련된 정보(위치, 상태, 기타 특성)가 포함됩니다. 여기서는 씬 오브젝트들이 힙에 동적으로 할당됩니다.
  • 스택 메모리: 씬 로드 과정에서 임시적으로 호출되는 함수들이 호출 순서에 따라 스택 메모리에서 처리됩니다.

3. 오브젝트 인스턴스화

- 씬이 로드되면 그 안에 포함된 모든 게임 오브젝트와 컴포넌트들이 메모리로 할당됩니다.

- 오브젝트 컴포넌트는 대부분 힙 메모리에 동적으로 할당되며, 이들이 생성되는 동안 생성자 함수가 호출되므로 스택 메모리에서도 일부 메모리가 사용됩니다.

- 인스턴스화된 오브젝트들은 모두 힙에 저장되어 씬이 활성화되는 동안 메모리에 유지됩니다. 이를 통해 씬이 렌더링되기 위한 기본 데이터가 갖춰집니다.

4. 스크립트와 메모리 사용

- 유니티는 각 게임 오브젝트에 연결된 C# 스크립트를 실행합니다.

- MonoBehaviour 스크립트의 Awake, Start, Update 등의 콜백 함수가 메모리에 로드되며, 호출될 때마다 스택에 함수 호출 순서대로 쌓이게 됩니다.

  • Awake와 Start 같은 초기화 메서드는 게임 시작 시 한 번 호출되며, 스택에 할당되었다가 호출이 끝나면 해제됩니다.
  • Update 함수는 매 프레임마다 호출되며 스택에서 반복적으로 올라왔다 내려가는 형태로 처리됩니다.

- 이 과정에서 각 스크립트는 메모리의 스택과 힙을 적절히 사용하여 동작합니다. 예를 들어, Update 내에서 메서드 호출이 많아지면 스택이 커질 수 있으며, 지나치게 많은 힙 할당이 발생하면 가비지 컬렉션(메모리 해제 작업)이 발생하여 게임이 일시적으로 느려질 수 있습니다.

5. 메모리 관리와 최적화

- 유니티 엔진은 가비지 컬렉션(GC)을 통해 불필요한 메모리를 자동으로 해제합니다.

- 힙 메모리에 할당된 객체 중 더 이상 사용되지 않는 객체들은 GC에 의해 정리됩니다. 예를 들어, 사용하지 않는 오브젝트를 null로 참조하거나 Destroy()로 제거하면 메모리에서 해제됩니다.

- 그러나 지나치게 많은 힙 메모리 할당과 해제는 GC를 자주 발생시키고, 이로 인해 성능 저하가 일어날 수 있습니다. 따라서 큰 오브젝트는 Object Pooling(오브젝트 풀링) 같은 패턴을 사용해 힙 메모리 할당을 줄이는 것이 좋습니다.

6. 씬 전환 시 메모리 처리

 

- 씬이 전환되면 기존 씬에 포함된 오브젝트들은 메모리에서 해제됩니다.

- SceneManager.LoadScene 또는 LoadSceneAsync로 씬을 전환할 때, 현재 씬의 오브젝트들은 힙 메모리에서 해제되고, 새로운 씬 오브젝트들이 힙에 할당됩니다.

 

 

총정리

 

스택은 함수 호출과 지역 변수의 저장, 메서드 호출 시 사용됩니다.

은 오브젝트의 인스턴스화와 게임 리소스 저장에 주로 사용됩니다.

씬 전환 시 오브젝트들이 힙에서 해제되고, 가비지 컬렉션이 이를 자동으로 정리하며, 메모리 누수를 줄이기 위해서 필요에 따라 오브젝트 풀링 등의 최적화 기법을 적용합니다.