docs: 性能部分收尾,4.4/4.6 定为不做 #57
@@ -530,7 +530,7 @@ Draw3dSolid(&dc, nColor); // 拖拽时每帧都走到这里
|
||||
|
||||
结论:暂缓。真要优化,收益只在「改完参数后立刻看平面图」这一下,不值得为此把 25 个 `Draw*2d` 的取尺寸逻辑改成参数 bbox。
|
||||
|
||||
### 4.4 P1:`GetInterface` 每次 `acedGetVar` + 临时实体(只做矩阵复用)
|
||||
### 4.4 P1:`GetInterface` 每次 `acedGetVar` + 临时实体(不做)
|
||||
|
||||
- `acedGetVar("INSUNITS")` 每个重载各调一次。**2026-10-25 决定不缓存**:`acedGetVar` 读的是数据库级变量,开销很小,而且当前图纸单位可以在会话中途变化(切换图纸、`INSUNITS` 被改),缓存反而要处理失效
|
||||
- `GetInfFaceInf` 每个面调两次 `GetTransformbyXform`,每次构造一个临时 `AcDbLine` / `AcDbPoint` 再走 `TransformEntity`。一个 6 面 box = 12 个临时实体;夹点显示时每个管嘴都要算
|
||||
@@ -552,7 +552,7 @@ rotation(90°, kXAxis, ptIns) // 竖放时再翻一次
|
||||
|
||||
所谓「提成世界矩阵」,就是把这串矩阵按同样顺序 `postMult` 合成一个 `AcGeMatrix3d M`,之后直接 `ptGe.transformBy(M)` / `vtDir.transformBy(M)`。`GetInfFaceInf` 里 12 次临时实体可以全部去掉,只剩 12 次向量乘法。
|
||||
|
||||
这条**尚未实现**,等 4.6 一起评估。
|
||||
这条**2026-10-25 决定不做**:`GetInfFaceInf` 只在夹点显示 / osnap 这类交互路径上跑,12 次临时实体的构造与 `transformBy` 相对于整条路径的开销占比很小,合成矩阵后省下的时间测不出来,反而多一份需要与 `TransformEntity` 保持同步的矩阵逻辑(后者一改,这里就错)。收益不明显,维持现状。
|
||||
|
||||
### 4.5 P1:`GetDraw2dables` 每次建 `*U` 块 + 跑 HLR(暂缓)
|
||||
|
||||
@@ -565,7 +565,7 @@ rotation(90°, kXAxis, ptIns) // 竖放时再翻一次
|
||||
|
||||
所以「剖切不用了」不等于「可以改语义」。暂不动,等确认其余调用方各自的期望。
|
||||
|
||||
### 4.6 P1:开图路径(待评估,未实施)
|
||||
### 4.6 P1:开图路径(不做)
|
||||
|
||||
`dwgInFields` 里无条件 `subDMesh2NewSolid()`,对每个 `kSubDMesh` 单元做一次 `ParseRevitFamily::parseJson`(`parseFamilyForRevit.cpp:1234`:RapidJSON 解析 + 遍历生成 `NewSolidBase`)。Revit 族转来的设备,这一步是开图耗时的大头之一。
|
||||
|
||||
@@ -590,6 +590,8 @@ rotation(90°, kXAxis, ptIns) // 竖放时再翻一次
|
||||
2. 若确实是大头,优先做「解析结果缓存」:以 `m_pData` 内容的 hash 为 key 缓存解析出的 `XPrimData` 数组,第二次遇到同一个族直接深拷贝。语义完全不变,风险最低
|
||||
3. 最后才考虑惰性化,且必须把所有读入口一次改全
|
||||
|
||||
**2026-10-25 决定不做**:三步里的前两步(先量、解析缓存)都要先有真实图纸的耗时数据支撑,而这一步的改动面(`dwgInFields` + `subDMesh2NewSolid` + 可能的解析缓存)远大于收益的不确定性,暂不投入。等实际有用户反馈"开图慢"、并且能量到 `subDMesh2NewSolid` 占比超过 20% 时再回头做。
|
||||
|
||||
### 4.7 度量建议
|
||||
|
||||
| 指标 | 位置 | 目的 |
|
||||
@@ -649,12 +651,14 @@ rotation(90°, kXAxis, ptIns) // 竖放时再翻一次
|
||||
| --- | --- | --- | --- |
|
||||
| 高 | 拖拽时走缓存,不重建(4.2) | 拖拽帧率、内存峰值 | 已完成(PR #53) |
|
||||
| 高 | 2D 路径改用参数 bbox,不触发 3D(4.3) | 一次性开销,收益有限 | 暂缓 |
|
||||
| 中 | 单元矩阵复用,去掉临时实体(4.4) | 夹点、osnap | 待做 |
|
||||
| 中 | 单元矩阵复用,去掉临时实体(4.4) | 夹点、osnap | 不做,收益不明显 |
|
||||
| 中 | `GetDraw2dables` 不建块(4.5) | 导出、DWG 体积 | 暂缓,调用方未确认 |
|
||||
| 低 | `subDMesh2NewSolid` 惰性化(4.6) | 开图 | 待量,不建议按原方案做 |
|
||||
| 低 | `subDMesh2NewSolid` 惰性化(4.6) | 开图 | 不做,改动大、收益不确定 |
|
||||
|
||||
`INSUNITS` 缓存(4.4 的第一条)已决定不做。
|
||||
|
||||
性能部分到此收尾:只有 4.2(拖拽走缓存)落地,其余全部按上面的结论维持现状。
|
||||
|
||||
### 5.4 需要先确认的事
|
||||
|
||||
1. ~~`booleanOper` 是否删除入参(3.15)~~ —— 2026-10-23 按「不删除入参」处理,理由见 3.15
|
||||
@@ -707,4 +711,4 @@ rotation(90°, kXAxis, ptIns) // 竖放时再翻一次
|
||||
2. ~~第二批(`m_Combins` 存盘清空)~~ —— 已完成(PR #48),见 3.1、5.2
|
||||
3. ~~第一批 6~11(逻辑)~~ —— 已完成,范围扩到 3.2~3.14 共 10 项,见 5.1
|
||||
4. ~~确认 5.4 剩下的问题~~ —— 3.7 已改(见 3.7),3.12 确认是故意的、不改,3.6 暂缓
|
||||
5. 第三批:4.2 已完成(PR #53);4.4 的矩阵复用待做;4.3 / 4.5 / 4.6 按 4.x 的结论暂缓或待量
|
||||
5. ~~第三批(性能)~~ —— 4.2 已完成(PR #53,用户自行修改并验证);4.3 / 4.5 暂缓,4.4 / 4.6 不做,性能部分收尾
|
||||
Reference in new issue
Block a user