From 0439cedbd2949d2376ba45349edb0ba6994c156e Mon Sep 17 00:00:00 2001 From: MikiraSora Date: Thu, 12 Sep 2024 23:33:58 +0800 Subject: [PATCH] optimze code --- .../FumenVisualEditorViewModel.Drawing.cs | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs index 5e1f8381..1f27a291 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs @@ -69,6 +69,8 @@ private Func private readonly List<(TGrid minTGrid, TGrid maxTGrid)> visibleTGridRanges = new(); private DrawXGridHelper xGridHelper; + private int cacheMagaticXGridLinesHash; + public IEnumerable CachedMagneticXGridLines => cachedMagneticXGridLines; public PlayerLocationRecorder PlayerLocationRecorder { get; } = new(); @@ -245,33 +247,30 @@ private void OnEditorRender(TimeSpan ts) xGridHelper.DrawLines(this, CachedMagneticXGridLines); - //todo 可以把GroupBy()给优化掉 - var renderObjects = - GetDisplayableObjects(fumen, visibleTGridRanges) - //.Distinct() - .OfType() - .GroupBy(x => x.IDShortName); + var map = ObjectPool>>.Get(); + map.Clear(); + foreach (var obj in GetDisplayableObjects(fumen, visibleTGridRanges).OfType()) + { + if (!map.TryGetValue(obj.IDShortName, out var list)) + { + list = map[obj.IDShortName] = ObjectPool>.Get(); + list.Clear(); + } - var containList = ObjectPool>>.Get(); - containList.Clear(); + list.Add(obj); + } - foreach (var objGroup in renderObjects) + foreach (var objGroup in map) { if (GetDrawingTarget(objGroup.Key) is not IFumenEditorDrawingTarget[] drawingTargets) continue; - - var contain = ObjectPool>.Get(); - contain.Clear(); - - contain.AddRange(objGroup); - //contain.SortBy(x => x.TGrid); + var list = objGroup.Value; foreach (var drawingTarget in drawingTargets) if (!drawMap.TryGetValue(drawingTarget, out var enums)) - drawMap[drawingTarget] = contain; + drawMap[drawingTarget] = list; else - drawMap[drawingTarget] = enums.Concat(contain); - containList.Add(contain); + drawMap[drawingTarget] = enums.Concat(list); } if (IsPreviewMode) @@ -316,9 +315,9 @@ private void OnEditorRender(TimeSpan ts) //clean up drawMap.Clear(); - foreach (var contains in containList) - ObjectPool>.Return(contains); - ObjectPool>>.Return(containList); + foreach (var list in map.Values) + ObjectPool>.Return(list); + ObjectPool>>.Return(map); PerfomenceMonitor.OnAfterRender(); } @@ -497,20 +496,28 @@ private void CleanRender() public void OnLoaded(ActionExecutionContext e) { + } private void RecalculateMagaticXGridLines() { - //todo 可以优化 - cachedMagneticXGridLines.Clear(); - var xOffset = (float)Setting.XOffset; var width = ViewWidth; if (width == 0) + { + cachedMagneticXGridLines.Clear(); return; + } var xUnitSpace = (float)Setting.XGridUnitSpace; var maxDisplayXUnit = Setting.XGridDisplayMaxUnit; + //check if it is necessary to recalculate and generate + var hash = HashCode.Combine(xOffset, width, xUnitSpace, maxDisplayXUnit); + if (cacheMagaticXGridLinesHash == hash) + return; + cacheMagaticXGridLinesHash = hash; + cachedMagneticXGridLines.Clear(); + var unitSize = (float)XGridCalculator.CalculateXUnitSize(maxDisplayXUnit, width, xUnitSpace); var totalUnitValue = 0f;