源码-运行时总览
篇章:05-源码深度-运行时核心模块
阅读时间:约 25 分钟
前置知识:了解 YooAsset 基础概念
一、引言
本章将深入解析 YooAsset 运行时端的整体代码结构和模块组织。YooAsset 的运行时端代码位于 YooAsset/Runtime/ 目录下,是 YooAsset 框架在游戏运行时执行的核心部分。运行时端的设计目标是为游戏提供高效、灵活、可靠的资源管理能力。
YooAsset 运行时端采用了清晰的分层架构和模块化设计,包含了从全局入口到资源管理的完整实现。本章将深入解析运行时端的整体架构。
二、运行时端代码结构
2.1 目录结构
YooAsset 运行时端的代码结构如下:
YooAsset/Runtime/
├── Core/ # 核心基础
├── YooAssets.cs # 全局入口
├── Package/ # 资源包
├── PlayModeImpl/ # 运行模式
├── AssetInfo/ # 资源信息
├── Provider/ # 资源提供者
├── OperationSystem/ # 异步操作系统
├── FileSystem/ # 文件系统
├── Download/ # 下载系统
├── Cache/ # 缓存系统
└── Manifest/ # Manifest 处理
Core 目录:
核心基础模块,包含了运行时的核心类、扩展方法、工具类等。
YooAssets.cs:
YooAssets 是 YooAsset 的全局静态入口,提供了统一的 API 让开发者与 YooAsset 进行交互。
Package 目录:
ResourcePackage 相关的类,封装了一组相关资源的加载、卸载和管理。
PlayModeImpl 目录:
运行模式实现,包含了 EditorSimulate、Offline、Host、Web、Custom 等多种运行模式的实现。
AssetInfo 目录:
AssetInfo 和 BundleInfo 等信息类,描述了资源和 Bundle 的元信息。
Provider 目录:
资源提供者(Provider)相关的类,封装了资源加载的具体逻辑。
OperationSystem 目录:
异步操作系统,提供了统一的异步操作管理。
FileSystem 目录:
文件系统抽象,提供了跨平台的文件访问能力。
Download 目录:
下载系统,负责资源的下载和热更新。
Cache 目录:
缓存系统,负责本地缓存的管理。
Manifest 目录:
Manifest 处理,提供了 Manifest 的序列化和反序列化能力。
2.2 模块职责
YooAsset 运行时端的各个模块职责清晰:
| 模块 | 职责 | 核心类 |
|---|---|---|
| Core | 核心基础 | AssetInfo, BundleInfo |
| YooAssets | 全局入口 | YooAssets |
| Package | 资源包 | ResourcePackage |
| PlayModeImpl | 运行模式 | EditorSimulateModeImpl, HostPlayModeImpl |
| Provider | 资源提供者 | AssetProvider, SceneProvider |
| OperationSystem | 异步操作系统 | AsyncOperationBase, OperationSystem |
| FileSystem | 文件系统 | IFileSystem, DefaultCacheFileSystem |
| Download | 下载系统 | DownloadManager, BundleDownloader |
| Cache | 缓存系统 | CacheSystem |
| Manifest | Manifest 处理 | PackageManifest, ManifestTools |
Core 详解:
Core 模块提供了运行时的核心基础,包括数据类、工具类、扩展方法等。
YooAssets 详解:
YooAssets 是全局静态入口,提供了统一的 API。
Package 详解:
Package 模块是 ResourcePackage 的实现,封装了资源包的所有功能。
PlayModeImpl 详解:
PlayModeImpl 模块提供了多种运行模式实现,开发者可以根据需要选择合适的运行模式。
Provider 详解:
Provider 模块是资源加载的核心,封装了不同类型资源的加载逻辑。
OperationSystem 详解:
OperationSystem 模块是异步操作的核心,提供了统一的异步操作管理。
FileSystem 详解:
FileSystem 模块是文件系统的抽象,提供了跨平台的文件访问能力。
Download 详解:
Download 模块负责资源下载和热更新。
Cache 详解:
Cache 模块负责本地缓存管理。
Manifest 详解:
Manifest 模块处理 PackageManifest 的序列化和反序列化。
三、初始化流程
3.1 初始化流程概述
YooAsset 的初始化流程如下:
YooAssets.InitializeAsync() → 加载 Manifest → 初始化 FileSystem
→ 初始化 OperationSystem → 启动监听 → 完成
加载 Manifest 详解:
初始化时首先加载 PackageManifest 文件。PackageManifest 包含了所有 Bundle 的信息。
初始化 FileSystem 详解:
初始化 FileSystem,根据运行模式选择合适的 FileSystem 实现。
初始化 OperationSystem 详解:
初始化 OperationSystem,准备异步操作管理。
启动监听详解:
启动必要的监听器,如下载监听、缓存清理监听等。
3.2 初始化详细步骤
YooAsset 初始化的详细步骤:
- 创建 YooAssets 单例
- 加载 Manifest 文件
- 初始化 FileSystem(构建内、缓存、Web 等)
- 初始化 OperationSystem
- 启动后台任务
- 返回 AsyncOperationHandle
创建 YooAssets 单例详解:
YooAssets 是全局静态入口,通过 Initialize 方法创建单例。
加载 Manifest 文件详解:
从指定位置加载 PackageManifest 文件,可以是本地或远程。
初始化 FileSystem 详解:
根据运行模式初始化 FileSystem。EditorSimulate 模式使用 DefaultBuildinFileSystem,Host 模式使用 DefaultBuildinFileSystem + DefaultCacheFileSystem + DefaultWebServerFileSystem。
初始化 OperationSystem 详解:
创建 OperationSystem 实例,启动 OperationUpdater 监听器。
启动后台任务详解:
启动缓存清理、版本检查等后台任务。
3.3 初始化涉及的核心类
初始化涉及以下核心类:
- PlayMode:运行模式,封装了 YooAsset 的运行模式
- FileSystem:文件系统,封装了文件访问逻辑
- CacheSystem:缓存系统,封装了缓存管理逻辑
- OperationSystem:异步操作系统,封装了异步操作管理
PlayMode 详解:
PlayMode 是运行模式的核心类,封装了 YooAsset 在特定模式下的行为。
FileSystem 详解:
FileSystem 是文件系统的抽象,提供了跨平台的文件访问。
CacheSystem 详解:
CacheSystem 是缓存系统的核心,提供了本地缓存的管理。
OperationSystem 详解:
OperationSystem 是异步操作系统的核心,提供了统一的异步操作管理。
四、核心接口
4.1 IResourcePackage
IResourcePackage 是 ResourcePackage 的接口:
public interface IResourcePackage
{
string PackageName { get; }
bool IsInitializeSucceed { get; }
AssetInfo GetAssetInfo(string location);
BundleInfo GetBundleInfo(string bundleName);
bool IsNeedDownload();
AssetOperationHandle LoadAssetAsync<T>(string location);
SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode);
SubAssetsOperationHandle LoadSubAssetsAsync<T>(string location);
RawFileOperationHandle LoadRawFileAsync(string location);
void UnloadAsset(AssetOperationHandle handle);
void UnloadScene(SceneOperationHandle handle);
void Release();
}
PackageName 详解:
PackageName 是 Package 的唯一标识符。
GetAssetInfo 详解:
通过 location 获取 AssetInfo,包括资源的 Bundle、依赖等信息。
LoadAssetAsync 详解:
异步加载资源,返回 AssetOperationHandle。
LoadSceneAsync 详解:
异步加载场景,返回 SceneOperationHandle。
4.2 IResourceManager
IResourceManager 是 ResourceManager 的接口:
public interface IResourceManager
{
AssetInfo GetAssetInfo(string location);
BundleInfo GetBundleInfo(string bundleName);
AssetOperationHandle LoadAssetAsync(string location, Type assetType);
SceneOperationHandle LoadSceneAsync(string location, LoadSceneParameters loadSceneParameters);
void UnloadAsset(AssetOperationHandle handle);
void UnloadScene(SceneOperationHandle handle);
void ClearAllAssets();
void ClearUnusedAssets();
}
GetAssetInfo 详解:
通过 location 获取 AssetInfo。
LoadAssetAsync 详解:
异步加载指定类型的资源。
ClearAllAssets 详解:
清除所有已加载的资源。
ClearUnusedAssets 详解:
清除未被引用的资源。
4.3 IProvider
IProvider 是 Provider 的接口:
public interface IProvider
{
string Location { get; }
EProviderStatus Status { get; }
float Progress { get; }
object AssetObject { get; }
void Provide();
void UnProvide();
void Update();
}
Location 详解:
Location 是 Provider 加载的资源地址。
Status 详解:
Status 是 Provider 的状态,包括 None、Loading、Loaded、Destroyed 等。
Progress 详解:
Progress 是 Provider 的加载进度,范围 0-1。
AssetObject 详解:
AssetObject 是 Provider 加载的资源对象。
4.4 IAsyncOperation
IAsyncOperation 是异步操作的接口:
public interface IAsyncOperation
{
EAsyncOperationStatus Status { get; }
float Progress { get; }
string Error { get; }
bool IsDone { get; }
event Action<IAsyncOperation> OnCompleted;
void Update();
void Cancel();
void Destroy();
}
Status 详解:
Status 是异步操作的状态,包括 Pending、Running、Succeeded、Failed、Cancelled。
Progress 详解:
Progress 是异步操作的进度。
OnCompleted 详解:
OnCompleted 是异步操作完成时触发的事件。
五、运行时关键类
5.1 YooAssets
YooAssets 是 YooAsset 的全局静态入口:
public static class YooAssets
{
public static ResourcePackage CreatePackage(string packageName);
public static bool InitPackage(ResourcePackage package);
public static void DestroyPackage(ResourcePackage package);
public static ResourcePackage GetPackage(string packageName);
public static void SetDefaultPackage(ResourcePackage package);
public static ResourcePackage GetDefaultPackage();
}
CreatePackage 详解:
创建一个 ResourcePackage 对象。
InitPackage 详解:
初始化 ResourcePackage,包括加载 Manifest、初始化 FileSystem 等。
SetDefaultPackage 详解:
设置默认 Package,使用 ResourcePackage.DefaultPackage 加载资源时使用此 Package。
5.2 ResourcePackage
ResourcePackage 是资源包的核心类:
public class ResourcePackage
{
public string PackageName { get; }
public bool IsInitializeSucceed { get; }
public PackageManifest Manifest { get; }
public IFileSystem BuildinFileSystem { get; }
public IFileSystem CacheFileSystem { get; }
public IFileSystem DeliveryFileSystem { get; }
public IPlayModeImpl PlayModeImpl { get; }
public ResourceManager ResourceManager { get; }
public DownloadManager DownloadManager { get; }
public CacheSystem CacheSystem { get; }
}
PackageName 详解:
PackageName 是 Package 的唯一标识符。
Manifest 详解:
Manifest 是 Package 的清单文件。
BuildinFileSystem 详解:
BuildinFileSystem 是构建内文件系统,管理包内资源。
CacheFileSystem 详解:
CacheFileSystem 是缓存文件系统,管理本地缓存。
PlayModeImpl 详解:
PlayModeImpl 是运行模式实现,根据不同的运行模式提供不同的行为。
5.3 ResourceManager
ResourceManager 是资源管理器的核心类:
public class ResourceManager
{
public Dictionary<string, ProviderBase> ProviderCache { get; }
public Dictionary<string, BundleLoader> BundleLoaders { get; }
public AssetOperationHandle LoadAssetAsync(string location, Type assetType);
public SceneOperationHandle LoadSceneAsync(string location, LoadSceneParameters parameters);
public void UnloadAsset(AssetOperationHandle handle);
public void ClearAllAssets();
}
ProviderCache 详解:
ProviderCache 是 Provider 缓存,存储已创建的 Provider。
BundleLoaders 详解:
BundleLoaders 是 Bundle 加载器缓存,存储已创建的 Bundle 加载器。
LoadAssetAsync 详解:
异步加载资源,返回 AssetOperationHandle。
5.4 Provider
Provider 是资源加载的核心:
public abstract class ProviderBase
{
public string Location { get; }
public EProviderStatus Status { get; protected set; }
public float Progress { get; protected set; }
public object AssetObject { get; protected set; }
public int RefCount { get; protected set; }
public abstract void Provide();
public abstract void UnProvide();
public abstract void Update();
}
Location 详解:
Location 是 Provider 加载的资源地址。
Status 详解:
Status 是 Provider 的状态。
RefCount 详解:
RefCount 是 Provider 的引用计数。
六、运行时数据流
6.1 资源加载数据流
资源加载数据流
用户调用 LoadAssetAsync → YooAssets 接收 → 转发到 ResourcePackage
→ ResourceManager 查找 Provider → 创建/复用 Provider
→ Provider 加载 Bundle → 加载资源 → 返回 Handle
YooAssets 接收详解:
YooAssets 接收用户的资源加载请求。
ResourcePackage 处理详解:
ResourcePackage 接收请求后,通过 Manifest 查找资源的 Bundle 和依赖。
ResourceManager 处理详解:
ResourceManager 查找或创建 Provider。
Provider 加载详解:
Provider 加载 Bundle,然后从 Bundle 中加载资源。
6.2 Bundle 加载数据流
Bundle 加载数据流
Provider 请求加载 Bundle → BundleLoader 创建 → FileSystem 读取文件
→ 解析 AssetBundle → 缓存 → 完成
BundleLoader 创建详解:
BundleLoader 负责加载 Bundle 文件。
FileSystem 读取文件详解:
FileSystem 从指定位置读取文件(本地或远程)。
解析 AssetBundle 详解:
使用 Unity 的 AssetBundle API 解析 AssetBundle。
6.3 资源卸载数据流
资源卸载数据流
用户调用 UnloadAsset → YooAssets 接收 → 转发到 ResourcePackage
→ ResourceManager 减少引用计数 → Provider 减少引用 →
引用为 0 时销毁 Provider → 引用为 0 时销毁 Bundle
引用计数减少详解:
每次 UnloadAsset 调用会减少 Provider 和 Bundle 的引用计数。
销毁 Provider 详解:
当 Provider 的引用计数为 0 时,Provider 会被销毁。
销毁 Bundle 详解:
当 Bundle 的引用计数为 0 时,Bundle 会被销毁。
七、总结
本章深入解析了 YooAsset 运行时端的整体代码结构和核心类,包括:
- 目录结构:Core、YooAssets、Package、PlayModeImpl、Provider、OperationSystem 等
- 初始化流程:从 YooAssets.InitializeAsync 到完成的完整流程
- 核心接口:IResourcePackage、IResourceManager、IProvider、IAsyncOperation
- 关键类:YooAssets、ResourcePackage、ResourceManager、Provider
- 数据流:资源加载、Bundle 加载、资源卸载的数据流
通过深入理解运行时端的整体架构,可以更好地理解 YooAsset 的工作原理,为后续深入学习各个模块打下基础。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/chenghai37/article/details/162686075




