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); }

요렇게 바꿔주자. 값 참조는 한번만 할 수 있도록

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더