단순히 유니티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에서 주기적으로 컬렉션 시도를 합니다. 그러면 그 수 만큼 게임의 성능에도 영향을 미치게 됩니다. 이 사실도 전혀 예상치 못했던 부분이라 개인적으로 부끄럽게 생각 합니다. 앞으로는 이 점을 유념에 두고 개발을 해야 겠습니다. |
댓글 없음:
댓글 쓰기