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位。
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 的内存信息.