Skip to content

Alpha v1.0.3

Pre-release
Pre-release

Choose a tag to compare

@Ender-William Ender-William released this 14 Sep 05:28
31f1428

InstructionX_UIKit alpha-v1.0.3

新增功能

1. 代码编辑器 InstructionX_UIKit.code_editor(新子包)

纯 PySide6 实现(无 WebView / JavaScript),对齐 VS Code 编辑区体验。

模块 内容
editor.py CodeEditor 主控件:Gutter + 文本区 + MiniMap + 浮层组合;Ctrl+D 多选批量编辑(替代 Alt+Click 多光标)
highlight.py HighlightEngine(QSyntaxHighlighter) + 亮/暗语法色板 + 语言注册表
languages.py 内置 python / cpp / js / ts / json / html / css / markdown / qss / plain,导入即注册
regions.py 区域高亮优先级:诊断 > 搜索当前命中 > 搜索命中 > 选中词 > 括号匹配 > 自定义层 > 语法
gutter.py / minimap.py 行号 + 断点 + 折叠标记;小地图(视口指示 + 点击跳转)
panels.py 查找替换栏 / 补全弹窗 / 悬停气泡(provider 驱动)
diff_editor.py DiffEditor:并排 / 内联 / auto 断点三种模式、滚动同步、变更刻度条
  • 能力:语法高亮、查找替换(正则 / 大小写 / 整词)、诊断标记、断点、基于缩进的折叠、补全与悬停 provider、自定义快捷键与绘制钩子、亮暗主题实时切换。
  • 演示页:demo/pages/code_editor.py(编辑器演示 + Diff 对比两个子页)。

2. 图表引擎:OpenGL 渲染

  • 图表绘制改由私有 GL 视口(QOpenGLWidget)承载,公共 API 零改动——set_option / update_option 的调用方式与渲染效果与历史一致。
  • GL 不可用时自动回退软件光栅视口(offscreen / minimal 测试环境、无 GL 驱动、UIKIT_CHART_GL=off)。
  • 分层渲染:静态前缀(底色 / 坐标轴 / 网格 / 刻度文字 / 图例 / 标题)与系列层分别位图缓存;纯数据更新时静态层命中缓存。

3. 图表引擎:大规模数据管线

  • 紧凑存储与零拷贝摄入:大数值数组按引用持有为缓冲区,set_option 不再逐元素深拷贝(150 万点由约 2.1 s 降至毫秒级)。
  • 运行时降采样与保真承诺:阈值 = 绘图区像素宽 × 系数,逐桶保留极值;逐像素列 y 极值与全量直绘严格一致,尖峰毛刺不丢。可见点数不超过阈值时不做任何降采样。
  • 轴范围计算向量化并按数据身份缓存(缩放提速约 35 倍);采样点映射矢量化并带首用自检护栏(抽样比对逐点结果,分歧即永久禁用快路径)。
  • 散点 large 像素桶聚合(图元压缩 2451 倍)。

4. 图表引擎:实时数据接入

sess = chart.stream(series="信号", window=20000, interval=1/90)
sess.write(value)          # 采集线程内高频调用,任意线程安全
sess.close()
print(sess.stats)          # {batches, points, frames, merged, dropped, buffered}
  • RingBuffer:单写单读无锁环形缓冲,先写数据、最后更新长度;写满丢最旧且 dropped 可观测。
  • FrameCoalescer:投递频率高于刷新节奏时成批合并、不丢点。
  • StreamSession:GUI 定时器按节奏取数入图;ChartWidget.set_stream_data() 为流式专用入口(只换数据、不重建 option / 渲染器)。

5. 图表引擎:GPU 原生直绘(可选,默认关闭)

{"type": "line", "name": "信号", "data": ys, "gpuDirect": True}

顶点经 VBO 上传、坐标变换在 GLSL 内完成(矩阵在 numpy 里一次算好再构造 QMatrix4x4)。GL 视口会「认领」可直绘的系列并由 GPU 接管绘制,QPainter 不再重复绘制同一条曲线。

6. Demo 新增

  • 巨量数据综合演示(图表页底部):默认 150 万点(可拉到 500 万),后台线程生成数据;读数给出数据点数 / 实际渲染点数 / set_option 耗时 / QPainter 单帧 / GPU 直绘单帧 / 90 fps 预算判定;含「滚动窗口」档位(500 ~ 100,000 点)。
  • 实时滚动流:独立线程按约 1000 点/秒产数写入环形缓冲,图表只保留最近 N 点、写满丢最旧;读数给出实测入图频率(会话记录的滑动平均)、采样吞吐、单帧绘制耗时。
  • 导航新增「代码编辑器」大类,共 11 大类 / 78 个演示页。

性能改进(均为实机实测)

场景 改进前 改进后
150 万点折线单帧布局 — 提速约 525 倍(运行时降采样接入后)
百万点 set_option 摄入 约 2.1 s(深拷贝) 毫秒级(零拷贝)
轴范围计算(缩放) — 提速约 35 倍
实时滚动流(20,000 点窗口) 约 20 Hz 单帧绘制 3.3 ms → 90 fps 预算内(预算 11.11 ms)
实时滚动流(500 点窗口) — 端到端 120 Hz、单帧绘制 1.3 ms
同屏 16 图稳态 — 1.0 ms / 图(缓存命中)

关键优化点:

  • 静态层缓存键由 option 版本号 改为轴的解析结果,纯数据更新时命中缓存(8.15 ms/帧 → 0)。
  • GL 视口下 GPU 接管的系列不再被 QPainter 重画(同一条曲线原本光栅化两遍,约 24 ms/帧)。
  • 流式入图走专用通路,省掉每帧 _rebuild(6.83 ms)与多余重排。

修复

图表引擎

  • 采样阈值改为不可关闭的「屏幕像素下限」:series["sampling"] = None 曾被实现为「不做任何降采样」,实测 150 万点在约 1000 px 绘图区下 layout 2.8 秒、单帧绘制 8.8 秒,事件循环完全不响应,Windows 判定 AppHang 并杀进程。现在该取值只表示「不做额外降采样」,阈值仍取绘图区像素宽 × 系数。
  • GL_MAX_POINTS 真正生效:常量注释写明「超过则拒绝直绘」,但执行点漏写,导致 150 万点照旧上传 VBO;现按实测标定为 400 万顶点(150 万 / 300 万顶点实测稳定)。
  • 空类目 category 轴的坐标映射:{"type":"category","data":[]}(流式入图标准写法)曾让屏幕 x 飞到 200 万(绘图区右边界才 872),整幅只剩一条压在边缘的平线。
  • update_option 接收 numpy 数组:原先会被当作「数据缺失」丢弃,导致曲线消失;现按引用包装为缓冲区。
  • 数值 x 轴的标量下标范围:修正后标量数据在数值 x 轴下不再落入坐标区之外。

代码编辑器

  • DiffEditor 的两个页面容器带上父级:无父级的 QWidget 是顶层窗口,addWidget 会先把它当窗口上屏一帧。在多屏(尤其混合 DPI)环境下表现为**「首次进入该页时闪出一个窗口又关掉」**。
  • 补全弹窗与悬停气泡延迟创建:两者带 Qt.ToolTip 标志(刻意不用 Qt.Popup,避免 show 时抓取键盘鼠标导致编辑器看似卡死),因而各自占一个原生窗口;原先在构造期创建会在页面可见时产生窗口抖动,现改为首次使用时创建。

升级说明

  • 无破坏性变更:图表、组件、布局、动画的既有调用方式完全不变。
  • 新增依赖声明:numpy>=2.0(图表大数据管线,已在 pyproject.toml / uv.lock / requirements.txt 同步)。
  • 版本号:InstructionX_UIKit.__version__ = "alpha-v1.0.3"(唯一来源);pyproject.toml 为 PEP 440 等价形式 1.0.3a1。
  • 环境变量(可选,均有默认值):UIKIT_CHART_GL(auto / on / off)、UIKIT_BLUEPRINT_GL。

已知限制

如实列出,避免误用:

  1. 90 fps 的判定口径:端到端帧率受显示器垂直同步约束(60 Hz 屏读数即约 60),不能用它判断图表能力;请以单帧绘制耗时为准(预算 1000/90 = 11.11 ms)。图表初始化时也可用 chart.benchmark() 取到该口径。
  2. sampling: None 在大数据上无效:屏幕像素是物理下限,超过它的点既看不到也点不到。需要更密的点请把图表画大(4K 下阈值自动升高),而不是关掉采样。
  3. large 聚合与 gpuDirect 适用面:gpuDirect 目前仅支持「标量数值序列」形态的折线;散点大数据请用 large。
  4. 同屏多图的极端场景:16 图稳态无压力(约 1 ms/图),但「同一帧内全部更新数据」约为 89 ms(11 fps),硬下限是每图采样与布局的固定成本,建议错开更新时机。
  5. 暗色主题仍为实验性功能,个别组件的细节表现仍在打磨。
  6. charts/pyramid.py(分层采样金字塔)已实现但默认不接入:实测查询 0.016 ms vs 直接分桶 0.63 ms,但内存 +2.0 倍。

测试与验证

  • 32 个离屏自测脚本、456 项检查通过(test_gallery 需逐页遍历全部 Demo,其中 Markdown / Mermaid / 聊天页依赖 Chromium GPU 进程,在受限沙箱环境下无法启动,与源码无关)。
  • 图表大数据相关验证:采样保真(逐像素列极值逐点比对)、空类目轴 band 中心逐点比对、像素下限、GPU 顶点数与数据点数一致性、实时滚动流读数口径。
  • 所有性能数字均在实机(NVIDIA RTX 4070 Ti SUPER / OpenGL 4.6、2560×1440@DPR1.5)以离屏或真实 GL 视口实测,非估算。