主题
旧客户端专用的图片缓存预算
部分旧客户端可能在 Canvas 图片回收、重载后出现纹理登记失效,表现为部分图片或物品图标批量变白,而文字和其他图片仍正常。临时提高 UI 图片缓存预算可以减少回收和重载机会,不能修复底层缺陷,也不能保证长时间游玩不再触发。
这是按症状选用的兼容措施。新项目、没有相符问题的项目,以及已经确认包含客户端修复的版本,不应默认加入此配置。
先确认适用范围
- 重点检查使用
Canvas.DrawImage/CanvasAnimated的图片,尤其是频繁切地图、加载大量场景图和物品图的项目。 - 对齐发生问题的游戏局、平台、客户端二进制版本及图片路径。文件缺失、下载失败、图片路径错误、GPU 设备丢失或内存不足,需要先处理对应错误;白图本身不能证明是缓存问题。
GameCore.ResourceType.Image保存的是资源路径,缓存这个值不等于持有 GPU 纹理。- 本规避方案使用既有
GameGraph.ResourceSystem.ResourceCache.SetMemoryBudgetAPI。已核对 Windows 客户端 176 的对应接口存在;这不表示所有更老版本或其他平台版本号都支持它。先确认项目 SDK 可编译且目标客户端支持此 API,不自行添加底层导入绕过版本限制。 - 不把
CapabilityVersion == 4或BinaryVersion <= 176当成受影响版本判断。客户端缺陷修复不一定提升能力版本,不同平台的二进制版本也不能直接比较。修复版本尚未确认时,保留显式的项目临时配置和测试记录,不编造版本门槛。
最小项目改动
在已确认需要规避的客户端初始化路径中,游戏 UI 视图创建后、首批 Canvas 图片开始绘制前设置一次。不要每帧调用,也不要放入所有项目共用的默认初始化代码。
以下 512 MiB 仅作为 PC 项目的测试起点;移动端或内存紧张设备必须另行评估,不能直接照搬:
csharp
#if CLIENT
GameGraph.ResourceSystem.ResourceCache.SetMemoryBudget(
"UITextureResource",
512UL * 1024 * 1024);
#endif"UITextureResource" 是此兼容措施指定的引擎资源类型名,需要原样填写。预算影响当前客户端 ResourceCache 中的这一类 UI 图片,共享该缓存的其他界面也会受影响,并非只作用于某一个 Canvas。新建游戏 UI 视图可能重新设置默认预算,因此应放在该视图创建后的项目初始化位置。
- 默认预算为 100 MiB。调高预算不会立刻分配对应大小的内存;它推迟闲置图片的预算回收。
- 预算不是整个游戏的内存或显存硬上限,仍在使用的图片也可能让占用超过预算。
- 不要用
0表示恢复默认。 此处0表示不按预算回收,图片很多的项目可能持续积累内存。撤除临时调用后完整重启客户端,恢复默认初始化行为。 - PNG/JPEG 文件大小不代表运行时纹理大小。可用宽 × 高 × 每像素字节数估算源图基础层,再区分实际纹理压缩、mipmap 和同时驻留集合;不要把所有图片的估算总和当作实时显存占用。
避免加重触发
- 不要定时调用
ImageCache.Invalidate、强制释放资源或反复清缓存作为刷新方案,这会增加回收和重载。 - 不要承诺销毁重建 Canvas 能恢复。同一个游戏视图中的 Canvas 共用底层图片登记,换一个 Canvas 不会清空整个视图的登记状态。
- 图片已经变白后,调高预算不会自动修复已损坏的纹理;先完整退出并重启客户端,再验证配置。
- 若仍容易触发,可降低大幅场景图片的实际像素尺寸,减少运行时纹理占用。单纯减小 PNG 文件字节数通常达不到这个目的。
验证与撤除
在相同旧客户端、相同项目资源和相似游玩路线下,对比修改前后反复切地图、开关背包、滚动图标及长时间游玩的表现,同时记录进程内存和可获得的纹理内存统计。不能用最新编辑器正常显示替代旧客户端验证。
如仍出现白图,或内存占用/稳定性变差,停止提高预算,保留日志并继续排查;不无限增加预算。没有运行测试时,明确标为“待验证的临时规避”,不能写成已修复。
待目标平台实际发布包含 Canvas 图片生命周期修复的客户端后,在新客户端移除这项临时配置,重新做上述回归。混合版本支持期若需要按版本启用,仅使用该平台已确认的修复版本界限。移除规避后不再依赖特殊预算,应以客户端修复为长期方案。