이 글은 유니티 자습서의 Best Practices 문서 중 Resources Folder를 번역/의역한 것입니다.
Resources 폴더
이 글은 “유니티5의 에셋과 리소스 관리” 시리즈의 3번째 글입니다.
이 챕터는 Resources 시스템에 대하여 다룹니다. 이 시스템은 개발자가 여러 에셋들을 Resources 폴더에 두고 런타임동안 Resources API를 통해서 에셋을 로드/언로드할 수 있도록 해줍니다.
2.1 Resources 시스템을 위한 실용 가이드
사용하지 마세요.
다음과 같은 이유들로 사용하지 않기를 강력하게 권고합니다
Resources 폴더를 사용하는 것은 메모리 관리를 더욱 복잡하게 만듭니다.
Resources 폴더를 부적절하게 사용하면 어플리케이션 시작 시간과 빌드 시간을 늘리게 됩니다.
Resources 폴더들이 많아지면 그 안에 있는 에셋들의 관리가 힘듭니다.
Resources 시스템은 사용자 정의 컨텐츠를 특정 플랫폼으로 옮기는 것이 까다로워집니다. 컨텐츠를 업그레이드하는 경우도 마찬가지입니다.
디바이스에 맞는 컨텐츠를을 조정하는데 적합한 주요 기능은 에셋번들입니다.
2.2 Resources 시스템의 적절한 사용
다음과 같은 두 가지의 경우에는 개발 시 Resources 시스템을 사용하기에 적합한 경우입니다.
빠른 프로토타이핑이나 검증이 필요한 경우에는 Resources를 사용하기에 좋습니다. 간단하고 사용하기 쉽기 때문입니다. 하지만, 프로젝트가 프로덕션 단계에 가게 되면 Resources 폴더 사용을 중단해야 합니다.
Resources 폴더는 다음 모든 경우를 만족하는 상황에서는 유용한 시스템입니다.
Resources 폴더에 들어있는 컨텐츠들은 메모리에 민감한 것 들이 아닐 경우
컨텐츠가 어플리케이션의 수행 시간 동안 계속 필요한 경우
컨텐츠가 패치될 일이 거의 없는 경우
컨텐츠가 플랫폼이나 디바이스별로 달라지지 않는 경우
이 중 두 번째 케이스에 해당하는 예시는 전역으로 사용되는 싱클턴 모노비헤이비어나 페이스북 앱 ID등의 서드파티 데이터를 다루는 에셋등이 될 것입니다.
2.3 Resources의 시리얼라이제이션
프로젝트 빌드 시 “Resources” 폴더 내 모든 에셋과 오브젝트들은 하나의 시리얼라이즈된 파일에 정보가 담깁니다. 이 파일은 에셋번들처럼 메타데이터와 인덱싱 정보를 포함합니다. “에셋번들 의 근본”챕터의 “에셋번들이란 무엇인가?” 섹션에서 설명된 바와 같이, 이 인덱싱 정보는 시리얼라이즈된 룩업 트리를 포함합니다. 여기에는 주어진 오브젝트 이름을 파일 GUID와 로컬 ID와 매칭시키는데 쓰이는 정보들을 포함합니다. 오브젝트를 시리얼라이즈된 파일의 몇 바이트째 위치시키느냐등의 정보도 포함합니다.
룩업 데이터 구조가 균형잡힌 탐색 트리라서 구축 시간 비용은 O(N log(N)) 비율로 증가합니다.(대부분의 플랫폼에서는 C++ Standard Template Library의 std::multimap를 사용합니다.) 여기서 N은 트리에 들어가는 오브젝트 갯수를 의미합니다. 이러한 증가치는 인덱스의 로딩 타임에 많은 비용이 들게합니다. 따라서 Resources 폴더 안의 오브젝트들이 많을수록 성능에 좋지 않습니다.
이 동작은 건너뛸 수 없기때문에 어플리케이션의 초기 시작 시간을 늘리게 되서 인터렉션이 불가능한 스플레시 화면이 떠 있는 시간이 길어지는 요인이 됩니다. 특히 저사양 기기일 수록 Resources 시스템에 많은 오젝트가 포함되있으면 어플리케이션 시작 시간이 매우 길어지게 됩니다. 특히, Resources 폴더의 대부분의 오브젝트들이 첫 씬에서 보여질 필요가 없는 경우에는 효율적이지 못한 상황이 되는 것입니다.
'Unity3D > Others' 카테고리의 다른 글
유니티 안드로이드 빌드 환경 설정 가이드 (5) | 2018.08.03 |
---|---|
유니티 최적화 관련 문서들 모음집 (Documents of optimization for Unity) (5) | 2018.07.10 |
Unity OVR Input (2) | 2017.09.30 |
나만 안써 진짜 사람들 메모리 프로파일러 다 쓰고 나만 안써 (0) | 2017.08.16 |
Debug.Log() 사용 시 주의점 (1) | 2016.08.31 |
"게임은 어떻게 만드나요?" 라는 질문에 뭐라고 대답해야 할까요? (질문글 작성 가이드) (0) | 2015.08.18 |
유니티 배우려는데 무슨 언어로 배워야할까요? C#? 아니면 자바스크립트? (3) | 2015.06.12 |
Unity 4.6 프로젝트 Unity 5로의 마이그레이션 후기 (0) | 2015.05.27 |