company-desktop
|
facf14699b
|
fix: AecDbX3dPart 记住"已尝试建过",避免 Hide 构件被反复重建
现象:开图时 X3dPart 的 EnsureCreated 命中率只有 10.1%,1914 次重建里
721 次产出 NULL(38%),单个对象最多被重建 544 次。
根因:EnsureCreated 的命中条件是 !m_bNeedCreate && m_pSolid != NULL,
而 Rebuild() 里对 Hide 构件是"故意不建几何、直接 return true"——
m_pSolid 按设计就是 NULL,于是每次访问都重新走一遍 Rebuild,永远不可能命中。
子项全为空的构件同理。
修复:
- 新增 m_bCreated 标记"已经尝试建过"(无论是否产出实体)
- EnsureCreated 命中条件改为 !m_bNeedCreate && (m_bCreated || m_pSolid != NULL)
- Rebuild 入口置 m_bCreated = true;所有设 m_bNeedCreate = true 的 setter
同时置 m_bCreated = false,保证参数变化后仍会重建
- 重建后仍无实体时打一条日志(限前 5 条,带 m_sName),方便定位是哪些构件
实测(big1.dwg / R230 Debug):
X3dPart 命中率 10.1% -> 41.4%
重建次数 1914 -> 1248(-666)
rebuild_null 721 -> 55
单对象最多重建 544 -> <=3
开图墙钟 93 s -> 93 s(无变化)
注意:这 666 次空转没有带来可测的提速,因为 Rebuild 里 Hide 的早退分支在
布尔运算之前,每次只有几微秒。所以这是正确性/整洁度修复,不是性能修复;
但消除了"个别构件被重试几百次"这种病态行为,也暴露了"哪些构件建不出实体"。
顺带新增诊断(Debug + AEC_PERF_COUNTER=1 才生效,Release 无开销):
- SectionPerf::NoteEnsure():按 tag 统计"延迟建几何"的命中/重建,
并给出对象维度直方图与重建次数最高的对象
- AecDbX3dPart::Rebuild / AcDbX3dSolid::EnsureCreated / AecDbGuardBar::Draw3d 打点
- tools/run_acad_perf.ps1 增加 -CpuTrace:用 xperf 采 CPU 采样并 merge 成 etl,
可直接喂 tools/perf_diagsession.py(VS 的 VSDiagnostics 在这台机器上会卡住,
wpr -stop 有 COM 线程模式 bug,故用 xperf)
验证:R230 Debug 编译通过并部署,自动开图取数;截面缓存与回写仍为 0/正常。
|
2026-10-28 22:51:01 +08:00 |
|
company-desktop
|
e3fff2ad66
|
fix: SAT 临时文件唯一化,修 DGJM.sat 读取越界
1. AcDbX3dSolid::CreateFromSat 的 temp\temp.sat 改为
temp_<pid>_<原子序号>.sat,用完 DeleteFile。原来固定名且从不删除,
两个 CAD 实例同时从 SAT 重建时会互相覆盖。
2. DGJM.sat 的读取统一改成「分配时补终止符 + 按实际读到的长度赋值」:
new char[n] 之后直接赋给 CString 会把未初始化内存当字符串读到终止符,
现在 new char[n+1] + memset,再用 CString(pszTxt, nRead) 明确长度。
涉及 AcDbX3dSolid、AecDbEarthWormFitting、DGJMDlg、GJYXJMDlg、
JMDBDlg、JMSJDlg 共 6 处。
DGJM.sat 本身仍是固定文件名,写读双方靠它隐式传递,本次不改名。
|
2026-10-21 23:39:47 +08:00 |
|
company-desktop
|
f80ec56189
|
fix: AcDbX3dSolid 正确性小修(失败留痕/缓存失效/GSMarker/死代码)
- StringToRegion 两个重载在 fixACISFormat 拒绝时打印长度与 SAT 首行,
原来完全静默,现场只表现为构件消失,无法定位
- ReCreate 统一失效绘制缓存:清 m_pSolidDraw、m_arRegionFaces、
m_pSubDMeshDraw。原来只有 AddMove/ResetMove/AddRotate/ResetRotate 清,
TransformBy/SetSolidData/SetOrgPoint 调完 ReCreate 后 Draw3d 仍画旧几何
- GSMarker 改用独立成员 m_nGSMarker,不再借用 m_sszPoint2ds。
后者在 kExtrude/kLoft/kSweep 里存断面/路径串,SetGSMarkerID 会覆盖成数字,
导致 ReCreate 静默失败、几何丢失
- 删除 GetDrawSubDMesh 中 return 之后的 28 行不可达代码
- GetDraw2d / ByJson 补注释说明现状
|
2026-10-21 15:31:27 +08:00 |
|
company-desktop
|
81215c8fe1
|
perf: AcDbX3dSolid 几何改为懒重建
- 新增 m_bNeedCreate 标志与 EnsureCreated():dwgInFields 与拷贝构造
不再立即 ReCreate,延迟到首次访问几何时重建
- 开图时不再对每个单元逐个走 SAT 临时文件(acisOut/acisIn),
显著降低开图耗时;Clone 也省掉一次重建
- 所有读取 m_pSolid/m_pSubDMesh 的入口统一走 EnsureCreated:
GetNative3dSolid / GetDraw3dSolid / GetNativeSubDMesh /
GetDrawSubDMesh / GetDrawSubDMesh2D / GetCentoridPoint
- GetDrawSubDMesh 补 m_pSubDMesh 空指针保护
- TransformBy 保持原有行为(参数变更后必须重建)
|
2026-10-21 10:01:17 +08:00 |
|
gjm
|
164968b62e
|
chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
|
2026-10-04 00:04:20 +08:00 |
|
gjm
|
345044cb46
|
初始化提交
|
2026-09-28 15:28:50 +08:00 |
|