리소스 로딩 (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 – 게임 실행 중에도 리소스 업데이트 가능
만약 원하시면 제가 이 내용을 그림 포함한 구조도로 시각화해서 드릴 수 있습니다.
특히 로드 플로우 + 의존성 관리 + 오브젝트 풀 흐름을 한눈에 볼 수 있는 다이어그램을 만들면 이해가 훨씬 쉬워집니다.
제가 바로 만들어 드릴까요?