Version: 1.7
语言 : 中文
TextureManager 用法
AssetBundle依赖分析工具

UI 使用介绍

Texture Manager Setting 设置

Texture Manager 默认是关闭状态,若需要开启,通过 Project Setting > Texture Manager Setting ,勾选 Texture Manager

属性 描述
Memory Budget 默认是 1024,单位是 MB,支持调整 Texture Manager 管理的贴图内存上限,当上传到 GPU 中的贴图内存超过设置的阈值,会默认按照相机距离优先级剔除掉部分贴图以防止内存进一步上升。反之在预定的预算之内,会尽可能按照游戏原有的逻辑上传所需要的贴图。
Cache Budegt (WebGL Only) 默认是 30,单位是 MB,当 WebGL 下载后的纹理文件占用的内存 Cache 达到上限 30MB,会根据 FIFO 规则,即先进入 cache 的会被优先从内存 cache 中剔除。当再次需要目标贴图,会直接从 Indexed DB 中读取。
Remote Load 默认关闭,作用是控制读取贴图数据是从本地还是从 CDN ;
当关闭时,编辑器运行会直接读取 Cache 中的图片资源来模拟运行 Texture Manager 功能,当启用 Remote Load 时,需要填入有效的 CDN 下载地址;
可以支持编辑器中模拟 Texture Manager 实时运行下载贴图功能,在编辑器中运行下载的贴图会默认放在工程的 Temp 目录下。需要注意的是,当发布 Player 时候这里必须开启 Remote Load ,因为无论是 WebGL 还是小游戏均无法直接访问本地路径文件。
Custom Cache Location 默认关闭,默认的 Cache 路径是工程的Library/textureStreamingCache/TexRes。也就是说,贴图的资源文件都会放在该路径下。针对大部分公司的 SVN 或者其他版本控制软件一般不设置同步 Library 目录,为了避免重复生成贴图文件,可以启用 Custom Cache Location ,可以修改纹理资源存储位置,方便开发者协同开发。
Dummy Texture 默认关闭,当启用 Dummy Texture 时,剔除的纹理会被默认纹理替代,而不启用时纹理不全的 Renderer 会被自动剔除。后续在高级功能会详细介绍该功能。
Batch Size 默认是 1,作用是控制单帧上传贴图的数量,默认 1 表示单帧只允许上传一张贴图。
Texture Format Platform 默认关闭,当启用 Texture Format Platform 时,可以手动为对应的平台添加启用的纹理格式。图示中的意思是: 以 WebGL 为例,当运行在 PC 上会自动选择加载 DXT 格式的纹理,当运行在手机上会自动选择 ASTC 格式的纹理。此外用户还可以进一步为不同机型做格式自定义 ASTC 格式,以满足不同性能机器的使用。后续章节我们将详细介绍该功能。

Texture Inspector 设置

属性 描述
WebStreaming 默认关闭,表示是否开启目标贴图支持 Texture Manager 管理。
Priority Level 表示优先级,默认为 Low ,目前支持三种优先级:Low、Middle、High,当纹理内存达到 Memory Budget 时,会优先剔除纹理优先级等级低的纹理。一般不用设置该选项,当需要强制保证某张贴图永远不被卸载时,可以设置为 High
Uploaded Mode 表示贴图上传模式,默认是 uploaded immediately ,表示会被立即上传,上传时机和传统贴图一样。
uploaded reference 表示贴图只有被引用才会上传到 GPU 。
upload by renderer 表示贴图被场景中的 mesh renderer 或者 skinned mesh renderer 引用才会上传。
通常在游戏场景中除了场景中被 Mesh Renderer 和 Skinned Mesh Renderer 引用的贴图需要被设置为 upload by renderer 之外,其余均应该勾选 uploaded reference ,即通过引用去上传实际需要的贴图,当引用为 0 则及时释放该贴图的资源。

多格式支持设置

通过开启 Texture Format Platform 的支持,我们可以针对不同平台定制对应格式如下图所示:

在多格式支持下,Texture Manager 的运行逻辑是在每张贴图初始化时,根据用户的设置获取相应的格式。在加载贴图数据文件的过程中,系统将按照该格式加载对应的贴图数据,并上传到 GPU 供使用。此外,Texture Manager 具备单独打包模块,可以并行生成多格式纹理数据。而原始 Assetbundle 由于只存储了纹理的 metadata 信息,只需要单次打包;即使后续增加其他格式纹理,也无需重新打包 AssetBundle 。

用户需要自行判断平台的信息,并如下设置目标平台所采用的规则:

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void OnBeforeSplashScreen()
{
    //用户可以根据自己的判断条件设置当前平台格式
    if(SystemInfo.graphicsDeviceName.Contains("RTX"))
    {
        TextureManager.SetSupportTextureFromat("win");
    }
    else if (/*设备高端*/)
    {
        TextureManager.SetSupportTextureFromat("High");
    }
    else if (/*设备中端*/)
    {
        TextureManager.SetSupportTextureFromat("Middle");
    }
    else if (/*设备低端*/)
    {
        TextureManager.SetSupportTextureFromat("Low");
    }
    else
    {
        TextureManager.SetSupportTextureFromat("web");
    }
}

Texture Manager 生成的贴图数据文件的命名含义介绍:
GUID-Format-Hash128.abas ,其中 GUID 为 Unity 引擎中图片实际对应的贴图资源 GUID , Format 对应 Unity 文档中的格式 Unity Texture Format Docs ,Hash128 为数据内容 hash 。

以 0e5001bc94455964a9abc613d3e1604b–50–9d0a8.abas 为例, 0e5001bc94455964a9abc613d3e1604b 为该贴图文件在 Unity 中对应 Texture 的 GUID ,50 对应的枚举格式 TextureFormat 的 ASTC 6x6 ,9d0a8 为数据 hash 算出来的前 5 位。

更细粒度的多格式支持 (1.7.0 preview)

从团结引擎 1.7.0 preview 版本开始,Texture Manager 支持在编辑器中对每一张 Texture Asset 进行多格式支持的重载,支持在同一 Platform Operation 下,Texture Asset 使用自己重载的格式设置。

Texture Importer Inspector 中新增了对每个 Texture Asset 重载 Texture Manager Platform Operation Settings 的 GUI。其中每一行都严格按索引顺序对应 Project Settings -> Texture Manager Settings 面板中的一个全局的平台设置。

勾选 Override Texture Manager Operation 选项时,Texture Manager 在生成对应 Texture Asset 的 Web Streaming abas 数据时,以及使用 TextureManager.SetSupportTextureFromat()时进行设置本次运行选择的 Platform Operation 时,会尝试采用该面板中设置的数据。

如果该行显示为灰色,则说明当前 Texture Asset 的设置没有对对应的平台名称进行重载,此时该 group 名的对应设置(包括生成资源时和运行时选择时)仍然会使用全局设置

当 Override 数组长度大于全局的平台设置长度,则超出长度的 Override 设置不会被使用。

加减号按钮对当前 Texture Asset 的 TextureMultiFormat 的数组进行操作。

点击 加号按钮后,会按顺序新增一个平台的设置重载。

点击 减号按钮时,(由于实现限制,数组严格对齐全局设置的索引顺序),会在该 Asset 的 Operation 数组中移除选中的设置,而全局的平台名不会随之改变。

TextureImporter 中,也加入了对应的 API,支持使用脚本批量设置 Texture Asset 的多格式支持重载设置。

// public static TextureMultiFormat[] textureMultiFormats
// = new TextureMultiFormat[] { TextureMultiFormat.ASTC_Automatic, TextureMultiFormat.DXT_Automatic };


static void TestUpdateTextureManagerSettings()
{
    // Find all texture asset GUIDs
    string[] guids = AssetDatabase.FindAssets("t:texture");

    foreach (string guid in guids)
    {
        string path = AssetDatabase.GUIDToAssetPath(guid);
        TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter;

        importer.textureManagerPlatformGroupSettings = textureMultiFormats;
        importer.overrideTextureManagerOperations = true;
    }

    AssetDatabase.Refresh();
}

需要注意的是,如果一个 Texture Asset 的多格式设置被更改了,且该 Texture Asset 被打入了某个 AssetBundle 中,可能需要重新构建 AssetBundle 以应用最新的设置。

增量打包和资源清理 (1.7.0 preview)

之前版本的 Texture Manager 在生成多格式资源时,即使只修改了少数纹理,也需要完全重新打包一次。从团结引擎 1.7.0 preview 版本开始的 Texture Manager 在打包多格式资源时还加入了对源 Asset 数据是否更改的判断,如果源 Asset 的 Hash 没有更改,且本地缓存目录存在对应格式的文件,则在打包时不会再次去生成对应的文件。

如果源 Hash 更改了,则会删除原先的缓存目录中的相同格式的文件。该逻辑是必要的,原先可能会存在同一 GUID,同一格式不同 Hash 的资源同时在本地存在的情况,这时打包机打包时,由于格式映射表最多存储同一 GUID 同一格式的一个资源的信息,可能会引起格式映射表没有存储最新的资源 Hash,导致运行时使用了之前的不想使用的资源。

此外,从团结引擎 1.7.0 preview 版本开始,Texture Manager 默认会在打包时,首先清理缓存目录下当前 Texture Asset 之前存在的,但是目前配置不需要的格式的 abas 文件,以节省打包机的磁盘空间,并节约运行时格式映射表的内存占用。如果不想进行上述清理行为,原先打包资源调用的函数增加了参数,可以调用 TextureManager.GenerateMultiPlatformWebStreamingDataInternal(string[] guids, false)

Debug Helper

1. 性能耗时检测,可以通过 Unity Profiler 查看模块耗时消耗,如下图中:

Overview Description
Texture.UpdateUploadJobTaskQueue 更新上传任务队列耗时
Texture.ProcessUploadJobTask 处理上传任务,这里一般比较耗时,这里需要将贴图数据上传到 GPU
Texture.CheckDownloadTask 检测下载任务耗时
Texture.Thread 处理下载任务耗时

2. 贴图上传信息状态查看,当前仅支持上传模式为 upload by renderer 的贴图统计信息查询,具体如下:

  • TextureManager.GetTexturesInUse() 获取当前在使用的贴图,返回值为 TextureArray ,根据每个 Texture 对应可以调用 Texture2D.GetLoadState() 获取加载贴图数据获取贴图的状态, 返回值为加载的状态码,0–5 分别代表 kNotInCache,kInCache,kUploading,kUploaded,kDeleted。
  • TextureManager.GetCurrentMemory() 获取当前的贴图上传实际上传到 GPU 的内存信息.
TextureManager 用法
AssetBundle依赖分析工具