Unity - 메모리 관리 주의사항
출처 : https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity4-1.html

C# 환경에서는 프로그래머가 의도하지 않은 메모리 할당이 존재할 수 있다. 대표적인 예를 들면
- boxing
: 값 타입의 변수를 오브젝트 타입으로 변환하는 과정에서 발생. 오브젝트 타입으로 변형되면 자료형에 구애받지 않고 편하게 사용할 수 있는 장점이 있지만, 이 과정에서 불필요한 메모리가 할당된다.
: C# 환경에서는 박싱이 일어날 수 있는 경우에 대해서 따로 경고 메세지를 띄우지 않는데 가비지 컬렉터가 어느정도의 메모리 오버헤드는 잘 관리할 것이라 가정하기 때문. 하지만 유니티 환경에서는 경우에 따라 문제가 커질 수 있으므로 박싱을 피하는게 좋다.
- dictionary의 키 값으로 enum을 활용했을 때
: enum 값을 비교하기 위해 Compare 메소드를 사용-> 이 과정에서 박싱 유발
- foreach 문 사용
: 마찬가지로 박싱 유발
- 배열 형식으로 되어있는 Unity API에 접근할 때
:
for(int i = 0; i < mesh.vertices.Length; i++) { float x, y, z; x = mesh.vertices[i].x; y = mesh.vertices[i].y; z = mesh.vertices[i].z; // ... DoSomething(x, y, z); }
위 경우에는 매번 for 문이 돌아갈 때마다 mesh.vertices에 접근하는데 Unity의 경우 배열값에 접근하면 그 값에 새로운 복사값을 만든다. 따라서 위의 경우에는 오버헤드가 존재
var vertices = mesh.vertices; for(int i = 0; i < vertices.Length; i++) { float x, y, z; x = vertices[i].x; y = vertices[i].y; z = vertices[i].z; // ... DoSomething(x, y, z); }
요렇게 바꿔주자. 값 참조는 한번만 할 수 있도록

C# 환경에서는 프로그래머가 의도하지 않은 메모리 할당이 존재할 수 있다. 대표적인 예를 들면
- boxing
: 값 타입의 변수를 오브젝트 타입으로 변환하는 과정에서 발생. 오브젝트 타입으로 변형되면 자료형에 구애받지 않고 편하게 사용할 수 있는 장점이 있지만, 이 과정에서 불필요한 메모리가 할당된다.
: C# 환경에서는 박싱이 일어날 수 있는 경우에 대해서 따로 경고 메세지를 띄우지 않는데 가비지 컬렉터가 어느정도의 메모리 오버헤드는 잘 관리할 것이라 가정하기 때문. 하지만 유니티 환경에서는 경우에 따라 문제가 커질 수 있으므로 박싱을 피하는게 좋다.
- dictionary의 키 값으로 enum을 활용했을 때
: enum 값을 비교하기 위해 Compare 메소드를 사용-> 이 과정에서 박싱 유발
- foreach 문 사용
: 마찬가지로 박싱 유발
- 배열 형식으로 되어있는 Unity API에 접근할 때
:
for(int i = 0; i < mesh.vertices.Length; i++) { float x, y, z; x = mesh.vertices[i].x; y = mesh.vertices[i].y; z = mesh.vertices[i].z; // ... DoSomething(x, y, z); }
위 경우에는 매번 for 문이 돌아갈 때마다 mesh.vertices에 접근하는데 Unity의 경우 배열값에 접근하면 그 값에 새로운 복사값을 만든다. 따라서 위의 경우에는 오버헤드가 존재
var vertices = mesh.vertices; for(int i = 0; i < vertices.Length; i++) { float x, y, z; x = vertices[i].x; y = vertices[i].y; z = vertices[i].z; // ... DoSomething(x, y, z); }
요렇게 바꿔주자. 값 참조는 한번만 할 수 있도록
댓글
댓글 쓰기