애셋번들 사용패턴 (AssetBundle usage patterns) 3- 번역

애셋번들 사용패턴 (AssetBundle usage patterns) – 번역

원문 링크

 

이전글 – 애셋번들 배포

4.3 애셋 분배 전략 (Asset Assignment Strategies)

프로젝트의 애셋(Asset)을 애셋번들로 나누는 방법을 결정하는 일은 그리 간단하지 않습니다.
오브젝트 별로 애셋번들을 만들거나 모든 오브젝트를 애셋번들 하나로 만드는 방법을 선택하기 쉽지만, 이런 솔루션에는 심각한 단점들이 있습니다:

  • 애셋번들의 수가 너무 적은 경우
    • 런타임 메모리 사용량 증가
    • 로딩 시간 증가
    • 다운로드 크기 증가
  • 애셋번들의 수가 너무 많은 경우
    • 빌드 시간 증가
    • 개발의 복잡도 증가
    • 전체 다운로드 시간 증가

오브젝트를 어떤 방법(기준)으로 애셋번들로 그룹 지을지 결정하는 것이 중요합니다. 이를 위해 택할 수 있는 주요 전략은 다음과 같습니다:

  • 논리적 개체
  • 오브젝트 타입
  • 병행 콘텐츠(Concurrent Content)

하나의 프로젝트에서 콘텐츠의 카테고리에 따라서 위의 전략을 혼합해서 사용할 수 있다는 점을 명심하시기 바랍니다.
예를 들어, 특정 프로젝트에서 UI 구성요소를 함께 애셋번들로 그룹으로 묶어서 플랫폼 별로 대응하거나, 레벨 또는 씬 단위로 상호작용하는 콘텐츠를 그룹으로 묶을 수도 있습니다.

채택된 전략에 관계없이, 따르면 좋을 가이드라인은 다음과 같습니다:

  • 자주 업데이트되는 오브젝트들은, 일반적으로 변경되지 않은 상태로 유지되는 오브젝트와 분리해서 별도의 애셋번들로 만듭니다.
  • 동시에 로드해서 사용할 가능성이 높은 오브젝트들을 그룹으로 묶습니다.

예: 모델(Model)과 모델에 사용되는 애니메이션 및 텍스쳐.

  • 어떤 오브젝트가, 여러 애셋번들에 포함되어 있는 다수의 오브젝트에서 사용되는 경우, 해당 애셋을 별도의 애셋번들로 분리합니다.
    • 자식 오브젝트를 부모 오브젝트와 함께 그룹으로 묶는 것이 이상적입니다.
  • HD와 SD버전의 텍스쳐와 같이, 두 개의 오브젝트가 동시에 로드되지 않을 가능성이 높은 경우, 별도의 애셋번들로 분할합니다.
  • 다른 임포터 설정 또는 데이터가 적용된 동일한 오브젝트에서 파생된 오브젝트들이 여러개 있는 경우, AssetBundle Variant의 사용을 고려해 보시기 바랍니다.

위의 가이드라인을 따른 뒤에는, 특정 시점에 어떤 애셋번들의 콘텐츠 중에서 50% 미만의 콘텐츠만 로드된 경우, 애셋번들을 다시 분할하는 것을 고려해 보시기 바랍니다. 또한, 동시에 로드되는 작은 애셋번들(5-10 애셋을 가진)은 하나로 합치는 것을 고려해 보시기 바랍니다.

 

 

4.3.1 논리적 개체 묶기 (Logical entity grouping)

논리적으로 개체를 묶는 방법은, 오브젝트가 나타내는 프로젝트의 기능적인 부분을 기반으로 그룹으로 묶는 전략입니다.
이 전략을 채택하면, 어플리케이션에서 서로 다른 기능 단위 별로 별도의 애셋번들로 분할됩니다.

예:

  • UI 화면의 모든 레이아웃 데이터와 텍스쳐를 함께 번들로 묶기
  • 캐릭터 세트에서 사용하는 모든 텍스쳐, 모델, 애니메이션을 번들로 묶기
  • 다수의 레벨에서 공유하는 배경에서 사용하는 모든 텍스쳐 및 모델을 번들로 묶기

논리적 개체를 그룹을 묶는 방법은 가장 일반적인 애셋번들 전략이고, 특히 다음과 같은 경우에 적합합니다:

  • DLC (역자주: Downlodable Content, 게임에서 추가적으로 다운로드해야하는 콘텐츠를 말함. 참고 – https://namu.wiki/w/DLC)
  • 어플리케이션이 실행되는 전체 라이프타임 동안에 여러 곳에서 사용되는 개체(Entity)의 경우

 

예:

  • 공통으로 사용되는 캐릭터 또는 기본 UI 요소
  • 전적으로 플랫폼 또는 성능(Performance) 설정에 따라서 달라지는 개체(Entity)

논리적인 개체별로 그룹을 짓는 방법의 대한 이점은, 변경되지 않은 콘텐츠를 다시 다운로드하지 않고 개별 콘텐츠를 업데이트할 수 있다는 점입니다.
이 전략이 특히 DLC에 적합한 이유가 여기에 있습니다.
또한 이 전략은, 현재 사용중인 개체를 나타내는 애셋번들만 로드하기 때문에 메모리 효율이 가장 높은 전략입니다.

그러나, 오브젝트를 애셋번들에 할당하는 개발자는, 프로젝트에서 각 개별 오브젝트가 언제 그리고 어떤 방법으로 사용되는지에 대해서 모두 정확하게 파악하고 있어야 하기 때문에, 구현하기 가장 어려운 전략입니다.

 

4.3.2 타입 별로 그룹으로 묶기 (Type Grouping)

타입 별로 그룹을 짓는 방법은 가장 간단한 전략입니다. 이 전략에서는, 비슷하거나 동일한 타입의 오브젝트들을 같은 애셋번들에 배치합니다.
예를 들어, 여러 개의 서로 다른 오디오 트랙을 하나의 애셋번들에 배치하거나, 종류가 다른 언어 파일을 동일한 애셋번들에 배치할 수 있습니다.

이 전략은 간단한 반면, 빌드 시간, 로드 시간, 업데이트 측면에서 효율성이 가장 낮은 전략입니다.
이 전략은, 현지화(Localization) 파일과 같이, 크기가 작고 업데이트가 동시에 이루어지는 파일에 주로 사용됩니다.

 

4.3.3 동시 콘텐츠 그룹화 (Cocurrent content grouping)

동시 콘텐츠 그룹화는, 콘텐츠가 로드되고 사용되는 시점이 동일한 콘텐츠를 애셋번들로 그룹 짓는 전략입니다.
이 전략은 매우 로컬적인(지역적인) 프로젝트에서 가장 일반적으로 사용됩니다.
다시 말해, 콘텐츠가 어플리케이션에서 특정 장소와 특정 시점 외에는 거의 사용되지않는 경우에 이 전략을 사용합니다.
각 레벨 별로 고유한 아트, 캐릭터, 사운드 효과를 사용하는 레벨-기반 게임을 예로들 수 있습니다.

동시 콘텐츠 그룹화를 수행하는 가장 일반적인 방법은 씬(Scene)을 기반으로 애셋번들을 생성하는 것입니다.
특정 씬에서 사용되는 오브젝트를 대부분 또는 모두, 씬 기반으로 생성된 각 애셋번들에 포함시킵니다.

콘텐츠의 지역적인 특성이 강하지 않는 프로젝트 및 어플리케이션에 실행되는 전체 라이프타임 동안에 다양한 시점에서 일반적으로 사용되는 콘텐츠를 사용하는 프로젝트에서는, 논리적 개체 묶기(Logical entity grouping)전략을 이용해서 동시 콘텐츠 그룹화를 진행합니다.

두 전략 모두, 해당 애셋번들이 가진 콘텐츠의 활용을 극대화하기 위한 전략이기 때문입니다.

캐릭터가 월드 공간에서 랜덤으로 생성(Spawn)되는 게임을 예로들 수 있습니다.
이 경우, 어떤 캐릭터들이 동시에 나타날지 예측하는 것이 쉽지 않기 때문에 다른 전략을 이용해서 그룹화해야 합니다.

 

내용 끝까지 읽어주셔서 감사합니다.
배너 클릭은 저에게 많은 힘이 됩니다.
감사합니다 🙂

 

다음글 – 애셋번들로 패치하기

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, C++/C#, 1인 기업에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off