Company
교육 철학

Resource Loading(리소스 로딩)

리소스 로딩 (Resource Loading)

관련 소스 파일

GameFramework/GameFramework.csproj
GameFramework/ObjectPool/ObjectPoolManager.ObjectPool.cs
GameFramework/Resource/IResourceManager.cs
GameFramework/Resource/ResourceManager.ResourceChecker.cs
GameFramework/Resource/ResourceManager.ResourceIniter.cs
GameFramework/Resource/ResourceManager.ResourceLoader.AssetObject.cs
GameFramework/Resource/ResourceManager.ResourceLoader.LoadResourceAgent.cs
GameFramework/Resource/ResourceManager.ResourceLoader.ResourceObject.cs
GameFramework/Resource/ResourceManager.ResourceLoader.cs
GameFramework/Resource/ResourceManager.ResourceUpdater.cs
GameFramework/Resource/ResourceManager.VersionListProcessor.cs
GameFramework/Resource/ResourceManager.cs
GameFramework/Utility/Utility.Encryption.cs

시스템 개요

Resource Loading 시스템은 파일 시스템, 메모리, 디스크 등 다양한 소스에서 게임 에셋을 로드하고, 복잡한 의존성 처리오브젝트 풀 기반의 메모리 최적화를 지원하는 통합 솔루션입니다.
또한 비동기 로딩, 암호화 리소스의 해독 등 다양한 로딩 방식을 지원합니다.

핵심 구성 요소

ResourceLoader

ResourceManager 내부에서 에셋 로딩 작업을 총괄하는 주요 컴포넌트
기능:
에이전트 기반 비동기 로딩 관리
에셋 및 리소스 의존성 추적
오브젝트 풀과 통합된 메모리 관리
다양한 로딩 타입 지원 (파일, 메모리, 암호화 포함)

오브젝트 타입 & 메모리 관리

리소스 로딩은 두 가지 주요 오브젝트 타입을 사용하며, 둘 다 오브젝트 풀에서 관리됩니다.
ResourceObject
저장소에서 로드된 원시 리소스 파일 표현
AssetObject
원시 리소스를 가공하여 생성된 게임 에셋 표현

리소스 로딩 절차

1.
리소스 가용성 확인 – 요청한 에셋이 존재하고 로드 가능한지 확인
2.
의존성 확인 – 모든 의존성 에셋이 준비되었는지 검사
3.
캐시 확인 – 에셋 풀에서 이미 로드된 자산이 있는지 확인
4.
리소스 로드 – 파일 시스템/디스크에서 원시 리소스 데이터 읽기
5.
리소스 처리 – 원시 데이터를 실제 사용 가능한 게임 에셋으로 변환
6.
풀 등록 – 재사용을 위해 에셋을 에셋 풀에 저장
7.
콜백 반환 – 성공 콜백을 호출하여 로드된 에셋 반환

로딩 타입

로딩 타입
설명
사용 예
LoadFromFile
파일에서 직접 로드
크고 점진적으로 읽는 리소스
LoadFromMemory
전체 리소스를 메모리에 로드
빠른 접근이 필요한 리소스
LoadFromMemoryAndQuickDecrypt
메모리에 로드 후 간단한 해독
가벼운 보안 리소스
LoadFromMemoryAndDecrypt
메모리에 로드 후 완전 해독
DRM/보안이 중요한 리소스

의존성 관리

AssetDependencyCount – 해당 에셋에 의존하는 다른 에셋 개수
ResourceDependencyCount – 해당 리소스에 의존하는 에셋 개수
AssetToResourceMap – 에셋과 해당 리소스 간 매핑
→ 로드 시 의존성의 참조 카운트를 증가시키고, 언로드 시 감소시킵니다.
→ 참조 카운트가 0이 되면 메모리에서 해제됩니다.

오브젝트 풀 통합

장점:
메모리 파편화 감소
사용하지 않는 객체 자동 정리
메모리 사용량 제한 가능
리소스 타입별 우선순위 관리 가능

API 사용 예시

에셋 로드
LoadAssetCallbacks callbacks = new LoadAssetCallbacks( (assetName, asset, duration, userData) => { Debug.Log($"Asset '{assetName}' loaded in {duration} seconds"); }, (assetName, status, errorMessage, userData) => { Debug.LogError($"Failed to load asset '{assetName}': {errorMessage}"); } ); GameEntry.Resource.LoadAsset( "Assets/Prefabs/Character.prefab", typeof(GameObject), callbacks );
C#
복사
의존성 포함 로드
GameEntry.Resource.LoadAsset( "Assets/Prefabs/Character.prefab", typeof(GameObject), 100, // 우선순위 callbacks );
C#
복사
에셋 언로드
GameEntry.Resource.UnloadAsset(myAsset);
C#
복사

주요 설정 값

속성
설명
기본값
AssetAutoReleaseInterval
자동 해제 검사 주기(초)
60
AssetCapacity
에셋 풀 최대 용량
64
AssetExpireTime
미사용 에셋 유지 시간(초)
300
ResourceAutoReleaseInterval
리소스 자동 해제 검사 주기
60
ResourceCapacity
리소스 풀 최대 용량
16
ResourceExpireTime
미사용 리소스 유지 시간(초)
300

리소스 모드별 동작

Package Mode – 앱에 모든 리소스 포함, 업데이트 없음
Updatable Mode – 원격 서버에서 리소스 업데이트 가능
UpdatableWhilePlaying Mode – 게임 실행 중에도 리소스 업데이트 가능
만약 원하시면 제가 이 내용을 그림 포함한 구조도로 시각화해서 드릴 수 있습니다.
특히 로드 플로우 + 의존성 관리 + 오브젝트 풀 흐름을 한눈에 볼 수 있는 다이어그램을 만들면 이해가 훨씬 쉬워집니다.
제가 바로 만들어 드릴까요?