共享视觉模型缓存与实际资源持有
2026-09-20。接入原视觉模型缓存的共享 / 独占选择、引用计数、延迟回收与回调重入,并将其用于 Godot 静态模型资源持有。
武器构造覆盖仍为 1099 / 1419,273 阻塞、47 缺定义 / 创建等级。完整动画与地图初始化 / 注册未完成,全武器目标仍在推进。
原版规则
本批通过 IDA 重新核对 649690、648A70、648B40、648D20、648FC0、648570、648E20 与 6492C0:
- 共享缓存按请求字符串精确查找,区分大小写和分隔符;第一个匹配项获胜。
- 命中已有条目时,直接增加引用数并返回共享模型,不重新查询动画状态。
- 未命中时,先构造模型,再调用真实 593720 动画谓词。
- 有动画的新模型直接返回给调用方独占,不发布到共享缓存。
- 无动画模型才追加共享条目,引用数初始化为 1。
- 显式独占创建不查共享缓存,即使同路径已经有共享模型。
- 共享释放只减少计数;零引用模型在收集阶段才销毁。收集前重新获取可复用同一模型。
- 独占模型在释放时立即销毁。
- 计数保留原 uint32 回绕;收集使用末项补位,并重新检查当前槽与实时列表长度。
视觉缓存与碰撞缓存不可直接共用同一发布顺序:碰撞缓存会在模型构造前发布条目,视觉缓存则在构造与动画检查之后发布。因此,构造回调重入同路径时,视觉缓存可能追加同名的两个条目;不能自动去重或改为字典唯一键。
实现
core_sim/NativeVisualModelCache.cs 提供独立模型句柄、共享 / 独占持有结果、精确有序缓存与回收控制。它不持有 Godot 节点,也不把渲染资源句柄当成持久化角色状态。
torchlight-2-poc/NativeGodotVisualModelLibrary.cs 保存真实静态模型资源和共享状态:
- 一个 native model handle 对应一份已验证的静态 Mesh / Material 原型数据。
- 每个 Room 使用独立的显示视图承载各自的位置和可见性,视图不是另一个原生模型身份。
- 共享模型的 query flags、shadow 状态会同步到所有现有视图。
- 独占模型的数据状态与共享模型隔离,即使底层只读 Mesh 资源相同。
- 释放视图后再释放模型持有;共享数据由缓存收集,独占数据立即移除。
- 存在显示视图时禁止销毁其模型数据,失效句柄不会继续提供资源。
NativeGodotModelInstance 已使用这个公共资源库。正式 Room 后端按加载后的视觉烘焙位和对象自身可见位选择共享路径;NEVERBAKE 仍在选择前生效。父级传播可见性没有被误当作自身可见位。
这是 Godot 表示层适配,不是已经复原 Ogre StaticGeometry 的批次、绘制次数或完整 CGenericModel 构造。当前 Godot 模型后端仍只接受前批证明无骨骼的静态源;动画模型“返回独占”的核心分支已验证,但实际动画资源加载 / 播放尚未接入。
原代码对照
tools/build_native_visual_cache_oracle.py / native_visual_cache_oracle.c:
- 在独立 32 位进程运行原 649690、查找、释放、零引用收集、条目构造 / 析构与 vector 增长代码。
- 使用实际 MSVCP90 字符串及原 593720 动画 getter。
- 模型构造 / 析构和内存分配作为受控边界,覆盖构造重入、销毁时追加、同名条目、动画模型独占、大小写 / 分隔符 / Unicode、计数回绕和不同增长步长。
- 2448 组操作的模型身份、共享标志、条目顺序、引用计数、容量及回调记录全部与核心一致。
夹具跳过已经销毁的独占模型的重复释放,不声称复刻原生 use-after-free。以上也不是完整模型加载器的原代码验证。
实际 GPU 验证与回归
原静态视觉探针扩展为 44 项检查,包括:
- 两个实际 Room 视图共享一个模型句柄及两份引用;
- 查询标志与阴影修改传播到两个视图;
- 释放其中一个视图不销毁另一个仍持有的模型;
- 同路径独占创建不复用共享模型,独占销毁不减少共享引用;
- 最后共享释放后零引用仍可复用;收集后才失效;
- 回收共享条目不会销毁仍在使用的独占模型。
1797 条核心断言、385 项相关 Python 回归通过;Godot C# 构建零警告 / 零错误,coresimlint 通过。
重新查看本轮 rock.webp / foliage.webp(build/native_visual_backend/,短边 512,quality 80)。纹理、裁切边缘和轮廓保留,无实心背景矩形。局部评分仍为 COMP-FOCAL-SINGLE=2、COMP-SAFE-EDGE=2、COMP-NEG-SPACE=2、COMP-VALUE-GROUP=1、LIGHT-KEY-FILL=1、LIGHT-BLOOM-ABUSE=2;10/12,83.3%,B,无零分或硬门触发。暗部叶片分离偏弱是受控预览照明;没有改正式地图光照,也没有把此结果作为原版整图像素对拍。
产物、剩余与安全
- build/native_visual_cache_oracle/results.json:原代码参考及来源哈希。
- build/native_visual_cache_core.log / native_visual_cache_regression.log / native_visual_cache_build.log / native_visual_cache_lint.log / native_visual_cache_audit.log。
- build/native_visual_backend/result.json:44 项实际 GPU 生命周期检查与源文件 / 图像证据。
下一项是骨骼动画模型的数据、加载与播放,再组合完整地图初始化、条件分组和实际注册。全世界查询、攻击型 proc 以及剩余武器仍未提前放行。
按 godot-master 分离资源所有权与显示节点,维持只读资源共享、实例状态隔离并实际复测 GPU。main 原地工作、未提交、未 attach 原游戏。默认 warp_autosave.json SHA256 保持 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。