Skip to content

Commit d0066f3

Browse files
committed
perf(render): speed up DataTree layout and add benchmark coverage
- Add deterministic DataTree render scenarios, benchmark harness, and baselines - Optimize layout and paint paths with culling, guards, caching, and binary search - Fix snapshot compositing and separator rendering regressions - Add timing and regression tests; update TIMING_ENHANCEMENTS.md
1 parent c4678e8 commit d0066f3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+643
-2962
lines changed

Src/Common/Controls/DetailControls/AtomicReferenceSlice.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ public override void FinishInit()
145145
protected void RefreshTree(object sender, EventArgs args)
146146
{
147147
CheckDisposed();
148-
if (ContainingDataTree != null)
149-
ContainingDataTree.RefreshList(false);
148+
ContainingDataTree.RefreshList(false);
150149
}
151150

152151
public override void ShowSubControls()
@@ -171,13 +170,11 @@ protected void OnViewSizeChanged(object sender, FwViewSizeEventArgs e)
171170
int hMin = ContainingDataTree.GetMinFieldHeight();
172171
int h1 = view.RootBox.Height;
173172
Debug.Assert(e.Height == h1);
174-
var treeNode = TreeNode;
175-
int hOld = treeNode == null ? 0 : treeNode.Height;
173+
int hOld = TreeNode.Height;
176174
int hNew = Math.Max(h1, hMin) + 3;
177175
if (hNew > hOld)
178176
{
179-
if (treeNode != null)
180-
treeNode.Height = hNew;
177+
TreeNode.Height = hNew;
181178
arl.Height = hNew - 1;
182179
view.Height = hNew - 1;
183180
Height = hNew;
@@ -187,8 +184,6 @@ protected void OnViewSizeChanged(object sender, FwViewSizeEventArgs e)
187184
protected override void OnSizeChanged(EventArgs e)
188185
{
189186
base.OnSizeChanged(e);
190-
if (ContainingDataTree == null)
191-
return;
192187
if (Width == m_dxLastWidth)
193188
return;
194189
m_dxLastWidth = Width; // BEFORE doing anything, actions below may trigger recursive call.

Src/Common/Controls/DetailControls/AudioVisualSlice.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,14 @@ public override void Install(DataTree parent)
130130
CheckDisposed();
131131

132132
base.Install(parent);
133-
if (parent == null)
134-
return;
135133

136134
AudioVisualLauncher ctrl = Control as AudioVisualLauncher;
137135
ctrl.Initialize(
138136
m_propertyTable.GetValue<LcmCache>("cache"),
139137
Media.MediaFileRA,
140138
CmFileTags.kflidInternalPath,
141139
"InternalPath",
142-
parent.PersistenceProvder,
140+
ContainingDataTree.PersistenceProvder,
143141
Mediator,
144142
m_propertyTable,
145143
"InternalPath",

Src/Common/Controls/DetailControls/AutoMenuHandler.cs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,8 @@ public void HandleCreateMenuItem(object sender, EventArgs ea)
172172

173173
if (slice != null)
174174
{
175-
var containingDataTree = slice.ContainingDataTree;
176-
if (containingDataTree == null)
177-
return;
178-
179175
ClassAndPropInfo cpi = (ClassAndPropInfo)m_rgcpiCreateOptions[((MenuItem)sender).Index];
180-
var cache = containingDataTree.Cache;
176+
var cache = slice.ContainingDataTree.Cache;
181177
int hvoOwner = cpi.hvoOwner;
182178
int ihvoPosition = cpi.ihvoPosition;
183179
if (ihvoPosition == ClassAndPropInfo.kposNotSet && cpi.fieldType == (int)CellarPropertyType.OwningSequence)
@@ -196,10 +192,7 @@ public void HandleCreateMenuItem(object sender, EventArgs ea)
196192
// We added something to the object of the current slice...almost certainly it
197193
// will be something that will display under this node...if it is still collapsed,
198194
// expand it to show the thing inserted.
199-
slice.EnsureHwndCreated();
200-
var treeNode = slice.TreeNode;
201-
if (treeNode != null)
202-
treeNode.ToggleExpansion(slice.IndexInContainer);
195+
slice.TreeNode.ToggleExpansion(slice.IndexInContainer);
203196
}
204197
Slice child = slice.ExpandSubItem(hvoNew);
205198
if (child != null)
@@ -254,10 +247,7 @@ public ContextMenuHelper(LcmCache cache)
254247
public ContextMenuHelper(SliceTreeNode stn)
255248
{
256249
m_sliceTreeNode = stn;
257-
var containingDataTree = m_sliceTreeNode.Slice.ContainingDataTree;
258-
m_cache = containingDataTree != null
259-
? containingDataTree.Cache
260-
: m_sliceTreeNode.Slice.Cache;
250+
m_cache= m_sliceTreeNode.Slice.ContainingDataTree.Cache;
261251
m_mdc = m_cache.DomainDataByFlid.MetaDataCache;
262252
}
263253

@@ -332,16 +322,12 @@ protected bool OkToDelete(int hvoDeleteOwner, int flidDelete, bool isAtomic)
332322

333323
public void HandleDeleteMenuItem(Object src, System.EventArgs ea)
334324
{
335-
var containingDataTree = m_sliceTreeNode.Slice.ContainingDataTree;
336-
if (containingDataTree == null)
337-
return;
338-
339325
m_cache.DomainDataByFlid.BeginUndoTask(DetailControlsStrings.ksUndoDelete,
340326
DetailControlsStrings.ksRedoDelete);
341327
using (CmObjectUi ui = CmObjectUi.MakeUi(m_cache, m_hvoDeleteTarget))
342328
{
343-
ui.Mediator = containingDataTree.Mediator;
344-
ui.PropTable = containingDataTree.PropTable;
329+
ui.Mediator = m_sliceTreeNode.Slice.ContainingDataTree.Mediator;
330+
ui.PropTable = m_sliceTreeNode.Slice.ContainingDataTree.PropTable;
345331
ui.DeleteUnderlyingObject();
346332
}
347333
m_cache.DomainDataByFlid.EndUndoTask();

Src/Common/Controls/DetailControls/BasicTypeSlices.cs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,7 @@ public void OnChanged(Object obj, EventArgs args)
230230
private void m_cb_GotFocus(object sender, EventArgs e)
231231
{
232232
base.OnGotFocus(e);
233-
var containingDataTree = ContainingDataTree;
234-
if (containingDataTree != null)
235-
containingDataTree.CurrentSlice = this;
233+
ContainingDataTree.CurrentSlice = this;
236234
}
237235

238236
//// ************************************************************************
@@ -387,16 +385,12 @@ protected override void UpdateDisplayFromDatabase()
387385
protected override void OnGotFocus(EventArgs e)
388386
{
389387
base.OnGotFocus (e);
390-
var containingDataTree = ContainingDataTree;
391-
if (containingDataTree != null)
392-
containingDataTree.CurrentSlice = this;
388+
ContainingDataTree.CurrentSlice = this;
393389
}
394390

395391
private void Control_GotFocus(object sender, EventArgs e)
396392
{
397-
var containingDataTree = ContainingDataTree;
398-
if (containingDataTree != null)
399-
containingDataTree.CurrentSlice = this;
393+
ContainingDataTree.CurrentSlice = this;
400394
}
401395

402396
public void PropChanged(int hvo, int tag, int ivMin, int cvIns, int cvDel)
@@ -514,9 +508,7 @@ private void m_tb_LostFocus(object sender, EventArgs e)
514508

515509
private void m_tb_GotFocus(object sender, EventArgs e)
516510
{
517-
var containingDataTree = ContainingDataTree;
518-
if (containingDataTree != null)
519-
containingDataTree.CurrentSlice = this;
511+
ContainingDataTree.CurrentSlice = this;
520512
}
521513
}
522514
}

0 commit comments

Comments
 (0)