perf: X3dPart 布尔结果改为按需重建,开图不再逐件建体
方案 A(见 AcDbX3dSolid-refactor-plan.md 第 13 节)。开图慢的瓶颈是 AecDbX3dPartEntity::dwgInFields 无条件调 m_pPart->Create(),每个 part 都要 N 次建体 + N 次布尔。 A1:引入 m_bDirty - AecDbX3dPart 增加 m_bDirty,构造/拷贝构造置 true - 15 个改参数的接口置脏:AddX3dSolid、RemoveAt、RemoveAll3dSolidRec、 SetOrgPoint、SetAxis、SetBoolOperFor、SetHide、SetActive、PeelOffTheSkin、 AddMove×2、ResetMove、AddRotate、ResetRotate、CopyFrom - 新增 Rebuild()(protected):清标志后无条件重建,原 Create() 的函数体 - 新增 EnsureCreated():m_bDirty 或 m_pSolid 为空时才 Rebuild Create() 保持「显式调用一律重建」的语义,内部转调 Rebuild()。原因是外部 有 10 处先取 GetX3dSolid(0) 直接改(如 AecDbBDPipeBase:941 调 TransformBy) 再调 Create(),部件感知不到这类改动,做成幂等会漏掉重建。 A2:开图不建几何 - AecDbX3dPartEntity::dwgInFields 去掉 m_pPart->Create(),由 AecDbX3dPart::dwgInFields 结尾置脏 - 读入口统一先 EnsureCreated:CreateDraw3dSolid、Draw3d、getOsnapPoints、 GetForHouseSubtract 收益:关闭/冻结图层、视口外、XREF/审核/发布等不绘制的场景完全省掉建体与 布尔;全图可见时开图时间下降、首次 regen 补回。
This commit is contained in:
1 parent
b75b779518
commit
5a5cd08721
3 files changed
+49
-1
No files matched your search
@@ -71,6 +71,7 @@ public:
|
||||
int GetBoolOperFor() const;
|
||||
|
||||
bool Create();
|
||||
bool EnsureCreated() const;
|
||||
AcDb3dSolid* CreateDraw3dSolid() const;
|
||||
|
||||
int GetForHouseSubtract(AcDbVoidPtrArray& arSolidPtrs) const;
|
||||
@@ -117,6 +118,8 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
bool Rebuild(); //无条件重建布尔结果
|
||||
|
||||
//序列化
|
||||
CString m_sName;
|
||||
CString m_sGUID;
|
||||
@@ -138,6 +141,7 @@ protected:
|
||||
bool m_bActive; //活动状态
|
||||
int m_nPeelOff; //是否需要剖开
|
||||
AcDb3dSolid* m_pSolid; //原始solid元
|
||||
bool m_bDirty; //参数已变更,几何待重建
|
||||
mutable AcDb3dSolid* m_pSolidDraw; //临时绘制solid元
|
||||
mutable SHJson::WValue m_json;
|
||||
};
|
||||
Reference in new issue
Block a user