Repository navigation
Alpha v1.0.3
Pre-release
Pre-release
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 绘图区下layout2.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。
已知限制
如实列出,避免误用:
- 90 fps 的判定口径:端到端帧率受显示器垂直同步约束(60 Hz 屏读数即约 60),不能用它判断图表能力;请以单帧绘制耗时为准(预算 1000/90 = 11.11 ms)。图表初始化时也可用
chart.benchmark()取到该口径。 sampling: None在大数据上无效:屏幕像素是物理下限,超过它的点既看不到也点不到。需要更密的点请把图表画大(4K 下阈值自动升高),而不是关掉采样。large聚合与gpuDirect适用面:gpuDirect目前仅支持「标量数值序列」形态的折线;散点大数据请用large。- 同屏多图的极端场景:16 图稳态无压力(约 1 ms/图),但「同一帧内全部更新数据」约为 89 ms(11 fps),硬下限是每图采样与布局的固定成本,建议错开更新时机。
- 暗色主题仍为实验性功能,个别组件的细节表现仍在打磨。
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 视口实测,非估算。