05-01-源码-运行时总览

源码-运行时总览

篇章: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 初始化的详细步骤:

  1. 创建 YooAssets 单例
  2. 加载 Manifest 文件
  3. 初始化 FileSystem(构建内、缓存、Web 等)
  4. 初始化 OperationSystem
  5. 启动后台任务
  6. 返回 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 的工作原理,为后续深入学习各个模块打下基础。


上一篇:调试与诊断工具
下一篇:全局入口与资源包(YooAssets & ResourcePackage)

posted @ 2026-10-18 19:36  SmalBox  阅读(5)  评论(0)    收藏  举报