mvdocs

# 机器视觉基建验证与完善路线

目标设计与 API 草案,尚未实施。总体边界和推进状态见设计概述。

本文区分确认契约、待细化机制和尚未取得的证据,组织收敛与验收,不改写当前控件事实。

关联:概述 · 模型 · 内存 · 性能

# 当前确认与待细化边界

范围 已确认 仍需具体化或验证
图像模型 四格式、Info 合并、稳定 ReadOnly 与可写输出分离 泛型返回桥接的最小编译证据;工厂与外部适配边界
内存 独立引用、共享读/独占写、显式完成、pin 延寿 初始根范围登记;权限/取消竞争;归还并发与容量预约
ToolFlow 顺序 Run、终端链接、输入不可改写、稳定输出 输出集合与队列接管的最小集成接口、配额与诊断关联
最近输出 KeepLatest 与连接分离,动态打开稳定引用 空集合、快照不可用的完整事件语义;订阅/重放/淘汰竞争
相机 可持帧则导入,否则回调内复制 SDK 在 Stop/Close/断线时的地址保证、线程协议和池余量
显示 直接接收图像,复制/保留/脱离分别确认 四格式后端能力、线性化/mip、上传成本及像素对照
性能 全链路有界,真实归还与任务完成分离 稳态内存、归还尾延迟、停流基线、故障和平台证据

开放项不能弱化确认契约。例如可评估编译期只读接口,但不能允许工具流改写已发布输入;某 SDK 不支持持帧时复制接入,不假设地址一直有效。

# 分阶段推进与退出条件

阶段 涉及专题 退出条件
A. API 契约 图像模型、内存 最小声明可编译;格式、所有权、能力上限及错误类别一致
B. 存储协调 内存、诊断 初始化/恢复、最后引用、pin、取消/授予竞争及回调失败可验证
C. 工具与队列 ToolFlow、会话 0→0/0→N/N→0/N→M、暂存失败、部分路由、容量和清理规则可执行
D. 相机适配 采集、会话 持帧/复制、SDK 满池、归还变慢、断线、排空与超时有证据
E. 输出观察 动态调试 最近集合替换、空/不可用结果、动态连接、重放和查看者寿命一致
F. 显示集成 ImageDisplay、示例 四格式、ROI/负步长、取样、脱离、卸载/context 重建及失败保留
G. 系统验收 全部专题 长时间负载/故障验证、平台说明、NativeAOT 和当前文档迁移

阶段可在文档和原型层交叉推进,集成不能绕过前置资源安全验证。本轮只完成文档组织与契约整理,没有接口原型、源码工程或运行验证。

# 设计收敛时优先处理的问题

正文在对应专题维护,本表只记录推进入口,不建立第二份 API。

# 当前实现与目标边界

项目 当前源码事实 目标设计
输入 静态 ImageSource 与专门的 FrameImageSource 控件直接接收 IPixelImage,文件解码在图像创建阶段完成
内容模型 ImageFrame 同时拥有 owner 和一次提交身份 存储、读写对象、静态图像与显示更新分别负责
编号 SubmitAsync 要求 FrameId 严格递增 业务 ImageId 可空、可重复、可倒退,不参与排序
推进 单生产者等待绘制确认后继续提交 宿主按需设置下一张静态图像,无逐张绘制承诺
异步协调 来源会话、输入等待、绘制背压 新请求使旧准备失效,旧任务不能覆盖新意图
当前缓存 快照、mip 与 Skia tile 持有原图引用 内部不可变 DisplaySnapshot,区分原始存储与显示映射缓存
像素查询 UI 当前原始帧的灰度值 UI 当前快照的灰度、RGB/BGR 或深度原始样本
冻结 IsFrozen 暂停流消费 宿主暂停提交即可保持当前图像,不设流冻结状态
主题与宿主 Skia composition,主题设置焦点和裁剪 本专项不改变主题、坐标、交互或覆盖层职责

根因是将显示表面建模成连续帧消费者,使内存寿命、业务帧号和生产调度互相绑定。目标直接表达“设置当前图像”,不再叠加第二套流发布 API。

本次仅调整 specs。目标涉及 FrameImageSource、帧相关成员与事件的迁移或删除,是明确的 API/行为重设计,不再以“旧流协议完全保持”为目标。实际实施时同步库、Gallery、测试和当前控件文档,不能仅删一条帧号比较而保留整套流架构。

# 实施边界、迁移与验证

本次只调整设计稿,不修改源码、Gallery 或现有控件说明。实施按图像模型、显示捕获与释放、多格式渲染、调用方迁移四部分完成,每部分分别验证;完整交付时统一更新当前控件文档。

基础包抽取、任务流所有权集成和 SDK 会话适配必须有独立验证,不把 ImageDisplay 能显示一张图视为基建已稳定。API 草案中精确格式接口、泛型返回桥接及访问对象创建能力在实施前先做最小编译验证;外部扩展优先通过工厂导入存储和显式格式支持接入,不要求第三方绕过协调实体自行构造访问对象。

旧成员或旧草案 目标
ImageFrame / FrameImageSource / SubmitAsync IPixelImage / 格式接口,持续 SetImage 刷新
FrameId 递增、单生产者和绘制背压 由宿主调度,不再成为显示契约
ImageDisplay.Source: ImageSource? Source: IPixelImage?,编码加载在外部完成
PixelImageSource 显示适配层 删除该拟议类型,控件直接申请图像读取
灰度专用 ImagePixel.Gray 多格式原始样本与显式 TryGet 方法
FramePresentation / FrameRendered ImageDisplayUpdate / ImageRendered,安装与绘制分开
IsFrozen 宿主暂停提交,当前快照保持静态

这是明确的 API/行为重设计;特别是 Source 类型与文件加载职责变化,不承诺旧二进制或 XAML 写法兼容。不得通过 Source: object、隐式格式猜测或保留另一条私有流管线掩盖迁移。现有模板、视口、覆盖层、工具接口和渲染后端继续复用;工具的像素展示与 Gallery API 示例必须同步调整。

验证重点:

测试生命周期遵循测试价值与生命周期。实施需分别报告构建、模块测试、真实显示、多格式持续更新负载和 NativeAOT。本次文档仅检查链接、API 一致性与 diff,不提供实现或性能验证结论。