Skip to content

v0.5.1:同一块定义只细分一次,缩短大图纸画全时间 - #27

Merged
CHMOSE023 merged 1 commit into
mainfrom
dev
Oct 28, 2026
Merged

CHMOSE023 merged 1 commit into
mainfrom
dev

Conversation

@CHMOSE023

Copy link
Copy Markdown
Owner

v0.5.1 还没打标签,这个提交补进 v0.5.1:发布说明 docs/release-notes/v0.5.1.md 的"性能"一节已加一条、"开发与测试"已补上。

相关 issue #25(大图纸打开后显示慢)。PR #26 让大图纸先显示、边细分边画,但画全的总时间反而长了 20%~35%;这次让同一块定义只细分一次,抵回一部分。总时间仍比分帧以前长,所以不关闭 issue。

改动(ec64f99)

  • 块定义级细分缓存(BlockTessCache):InsertEntity::Draw 画每个阵列单元前问 IDrawSink::BeginBlockInstance,DrawContext 命中就把记下的结果经平移、旋转接上,不再克隆、逐个画块内子实体
    • 键:块定义;块参照的颜色、线型、线宽、图层(块内 ByBlock 与 0 层随它);插入变换去掉旋转、平移后的部分(线型在变换之后按世界长度铺,缩放、镜像不同的不能共用)
    • 记录时按世界坐标双精度另记一份,接上时换到新位置再落成 float;区域覆盖在原来的位置调用 Wipe
    • 不记:按像素烘焙的、纹理文字、图像、绝对角度的线型符号、只展开一次的块
  • 带裁剪框(XCLIP)的块参照里面也能用:ClipDrawSink 带上本层裁剪框转发
    • 记下的块整个在框内就原样接上,整个在框外就跳过,跨边照常逐个画
    • 框里也照常记录;裁剪框改动过内容时经 IDrawSink::NoteClipped 作废这次记录
  • 与分帧细分配合:命中缓存时,分段的序号与进度跳过这个块,下一帧接着画的位置不受影响
  • 不常驻内存:缓存只在分帧细分期间、一次全量拼接里保留,用完就清空;图纸有改动时也清空

效果(本机 GTX 1060 / D3D12,--bench,与旧版交替各跑两次)

图纸 画全:旧 → 新 打开到画全:旧 → 新
CK-05 2.32 → 2.15 s 3.3 → 3.1 s
CK-T 3.71 → 3.26 s 4.6 → 4.2 s
  • 模型页、布局页截图与不缓存时逐字节相同。线顶点只差几个,看不出来:
    • 线长正好是线型周期整数倍时,末尾那段零长度的虚线有没有,取决于舍入;
    • 有些顶点的 Z 是 -0.0 还是 +0.0。
  • 收益不大:重复多的是便宜的线、圆弧、多段线;贵的填充(每个约 40 µs)、单行文字(约 34 µs)几乎都只出现一次。

验证

  • MiniCADTests 全部通过(1800 项)
    • 新增 BlockTessCacheTests:各种插入变换、ByBlock 与 0 层、嵌套、虚线、文字、区域覆盖;裁剪框内、框外、跨边;分段细分里命中缓存。均与不缓存时相同
    • ProgressiveBuildTests 加了同步细分开 / 关缓存的对比
  • 桌面版 --selftest:新旧版都只有同样 3 项失败(拖动窗口跟着光标走,依赖真实鼠标),其余通过
  • 网页版本机编译通过;Linux 版没编译

🤖 Generated with Claude Code

相关 issue #25:#25

块定义级细分缓存(BlockTessCache):InsertEntity::Draw 画每个阵列单元前问 IDrawSink::BeginBlockInstance,
DrawContext 命中就把记下的结果经平移、旋转接上,不再克隆、逐个画块内子实体。
- 键:块定义、块参照的颜色 / 线型 / 线宽 / 图层(块内 ByBlock 与 0 层随它)、插入变换去掉旋转平移后的部分
  (线型在变换之后按世界长度铺,缩放、镜像不同的不能共用)
- 记录期间输出按世界坐标双精度另记一份,换回块坐标 × 缩放存下,接上时再落成 float;区域覆盖在原位置调用 Wipe
- 不记:按像素烘焙的、纹理文字、图像、绝对角度的线型符号、分段停在块中间的、只展开一次的块
- 裁剪框(XCLIP)里:ClipDrawSink 带上本层裁剪框转发,按记下的输入范围判断整个在框内(原样接上)、
  框外(跳过)、跨边(逐个画);框里照常记录,裁剪框改动了内容时经 NoteClipped 作废
- 分段细分:命中缓存时分段序号跳过这个块的直接子实体个数、进度加上叶子子实体个数
- Editor 只在成批细分时留着(分帧细分期间、一次全量拼接里),图纸一改动就清空;视口合成不用

本机 --bench(与旧版交替各两次):画全 CK-05 2.32 → 2.15 s、CK-T 3.71 → 3.26 s,模型页、布局页截图逐字节相同。
收益不大:重复的多是便宜的线、圆弧、多段线,贵的填充、单行文字几乎都只出现一次。

测试:BlockTessCacheTests(各种插入变换、ByBlock 与 0 层、嵌套、虚线、文字、区域覆盖,裁剪框内 / 外 / 跨边,
分段细分里命中缓存,均与不缓存时相同);ProgressiveBuildTests 加同步细分开 / 关缓存对比。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@CHMOSE023
CHMOSE023 merged commit c1a8117 into main Oct 28, 2026
0 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant