페이지

2016년 12월 21일 수요일

Unity3D 가비지 컬렉션 최적화

최근 트위터를 통해 접하게 된 Unity3D 가비지 컬렉션 최적화 내용 입니다.

단순히 유니티3D 개발 Tip으로만 끝나지 않는,
가비지컬렉팅 환경에서의 개발, 메모리 관리 전략에 대한
많은 힌트와 통찰을 얻을 수 있어서 좋았습니다.

여유가 되시면 한 번쯤 일독을 권해 드립니다.

원문 링크
https://unity3d.com/kr/learn/tutorials/topics/performance-optimization/optimizing-garbage-collection-unity-games?playlist=44069


번역본 링크
고맙게도 친절하게 원문 번역을 해 주신 분도 계시네요.
http://ronniej.sfuh.tk/optimizing-garbage-collection-in-unity-games-1/


아래 내용은 제가 직접 읽으면서 중요하다고 생각되는 부분들을 간단히 요약해 본 것입니다.


  1. 유니티에서 사용하는 두 가지 메모리풀
    > 스택 : 함수 및 특정 스코프 내의 변수 할당에 의해 메모리를 소모.
               주로 작은 데이터를 단기간 저장하게 됩니다.
    > 힙 : 동적 메모리 할당( new 사용 )에 의한 메모리 소모
             주로 큰 데이터를 장시간 보존하게 됩니다.

  2. 가비지 컬렉션은 언제 발생하는가?
    > 주기적으로 호출됩니다.
    > 메모리 할당 처리시, 메모리가 부족할 때 호출 됩니다.
    > 명시적 호출에 의해( ex. System.GC.Collect(); )
    > 개인적으로 Scene이 전환 될 때 알아서 컬렉션 된다고 알고 있었는데,
       이 글에서는 따로 그런 언급이 없었습니다. 
       최근의 경험으로 봤을 때도 씬 전환에 의해 컬렉션이 호출되지 않았던 거 같아요.
       실제로 작업 하면서 좀 더 지켜봐야 할 것 같습니다.        

  3. 예상치 못한 가비지 생성 사례
    > 문자열 처리 및 연산에 짜잘한 가비지들이 많이 생긴다고 합니다.
       StringBuilder클래스를 알게 된 이후부터 자주 사용하긴 했지만
       앞으로 더 자주 격렬하게 사용해야 될 것 같습니다.
    > 박싱. 값 타입의 변수가 참조 타입의 변수로 사용될 때 발생 합니다.
       원래 캐스팅 비용이 비싼건 알고 있었지만 가비지까지 발생 시킬줄 몰랐네요.
    > foreach문. 쓰기는 편하지만 이 과정에서 박싱 때문에 가비지가 발생 합니다.
       그 동안 애용했었는데 좀 더 고민을 하면서 써야 겠습니다.
       특히나 게임 처럼 항상 메모리가 부족한 어플리케이션 개발에는 말이죠.
    > 그 외에 익명 메서드, LINQ, 정규식 처리 등등.

  4. 메모리 파편화
    > 메모리 관리 시 항상 나오는 얘기인데, 그 동안 Unity3D를 사용하면서
       전혀 생각을 못했던 부분이라 크게 반성 하게 됐습니다.       
       각 가비지가 회수 되는 때는 천차만별이기 때문에
       사이즈가 작은 가비지가 늘어날수록 메모리 파편화가 심해집니다.
       처음에는 크고 아름다운 힙 영역이 앱 기동과 함께 생성될지 모르겠지만
       가비지 처리가 계속 될 수록 가용할 수 있는 힙의 메모리 영악 안에는
       가비지가 회수되더라도 조그만 크기의 영역들 밖에 남지 않게 됩니다.
       이렇게 되면 갑자기 큰 메모리를 요구할 때 메모리 부족에 의해 
       크래쉬가 발생하기 쉽게 됩니다.

 5. 가비지 컬렉션에 의한 성능 저하
  > 가비지가 늘어나면 메모리 부족만 걱정할게 아니라 성능 걱정도 해야 합니다.
     발생한 가비지의 레퍼런스 수 만큼 Unity3D에서 주기적으로 컬렉션 시도를 합니다.
     그러면 그 수 만큼 게임의 성능에도 영향을 미치게 됩니다.
     이 사실도 전혀 예상치 못했던 부분이라 개인적으로 부끄럽게 생각 합니다.
     앞으로는 이 점을 유념에 두고 개발을 해야 겠습니다.



댓글 없음:

댓글 쓰기