Texture Manager 可以通过 Edit -> Project Settings -> Texture Manager Settings 控制开关。其核心主要将贴图资源从 AssetBundles 中抽离,在单独的模块进行管理,其中 AssetBundles 只保留贴图的元数据信息。
Texture Manager 主要用于优化游戏中贴图资源的管理,解决因资源使用不合理或资源包冗余导致的内存和显存消耗问题,并且可以有效解决多平台格式问题。这个工具提供了全生命周期的贴图资源管理,支持 Unity Editor 和 MiniGame 平台。
主要功能:
使用限制:
问题一(纹理冗余): 当一张 Texture C 被两个 Bundle A 和 Bundle B 所引用,并且 Texture C 并未单独打包成 Bundle 或者也不存在与其他 Bundle 中,那么 Texture C 就会被同时打包进 Bundle A 和 Bundle B 中,加载时候会导致内存中存在两份 Texture C,尤其是在小游戏平台上 Texture C 的原始文件也会占用两份。这就导致无效的内存占用。
解决方案: Texture Manager 通过纹理重映射功能,会主动检测当前加载的贴图与已经存在的贴图是否相同,如果相同会将已存在于内存中的贴图关联到当前材质上,从而避免由于贴图的重复加载而导致无效的内存占用。
问题二(多平台格式问题): 小游戏一般采用 ASTC 格式,目前团结引擎只能支持固定的贴图格式出包。当游戏需要运行在 PC 上时候,采用 ASTC 格式需要进行 Decompress 后再上传,会增加额外的内存和性能消耗。于此同时,针对同一平台的游戏,高端和低端机型性能差异较大,往往单一的 ASTC 格式很难适应不同机型的需求。
解决方案: Texture Manager 的多格式支持可以解决这一问题。Texture Manager 可以支持用户设置贴图多个格式,并提供接口给用户,根据需求和机型动态的选择不同贴图格式。
问题三(贴图生命周期管理): 在实际游戏中,缺少良好的贴图生命周期管理,可能存在某些贴图,已经被上传到显存中,但是没有被实际使用,这些贴图会导致显存的升高问题。
解决方案: Texture Manager 根据场景中实际使用并引用的贴图,进行按需上传,当贴图未被使用时,会被动态卸载掉。
问题四(动态堆内存增加): 当前团结引擎贴图是默认打包进入 AssetBundle ,在小游戏平台,当加载贴图的 AssetBundle ,会增加额外的 Dynamic heap 。
解决方案: Texture Manager 中贴图的文件存储是存在 Js 的内存中,并且会动态清理,不会增加额外的 Dynamic heap 。
问题四(内存碎片与动态堆增大): 当前团结引擎中,加载不同的贴图,会为每个贴图单独分配一块内存用于存放贴图数据,这块数据会在目标贴图上传到 GPU 后释放掉;如果同时加载多张贴图,会同时分配多块内存,这就会导致内存碎片,同时也会增加 Dynamic heap 。
解决方案: Texture Manager 贴图在加载时,并不会给数据分配内存;只有当贴图实际需要上传 GPU 时候,才会分配一块内存,用于贴图上传到 GPU 。而且这块内存是复用的。基于此,可以有效的避免一次性加载贴图过多,而导致 Dynamic heap 变大和内存碎片。