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 格式,以满足不同性能机器的使用。后续章节我们将详细介绍该功能。 |
属性 | 描述 |
---|---|
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 版本开始,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 以应用最新的设置。
之前版本的 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)
。
Overview | Description |
---|---|
Texture.UpdateUploadJobTaskQueue | 更新上传任务队列耗时 |
Texture.ProcessUploadJobTask | 处理上传任务,这里一般比较耗时,这里需要将贴图数据上传到 GPU |
Texture.CheckDownloadTask | 检测下载任务耗时 |
Texture.Thread | 处理下载任务耗时 |
TextureManager.GetTexturesInUse()
获取当前在使用的贴图,返回值为 TextureArray ,根据每个 Texture 对应可以调用 Texture2D.GetLoadState()
获取加载贴图数据获取贴图的状态, 返回值为加载的状态码,0–5 分别代表 kNotInCache,kInCache,kUploading,kUploaded,kDeleted。TextureManager.GetCurrentMemory()
获取当前的贴图上传实际上传到 GPU 的内存信息.