diff --git a/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultDebugPerfomenceMonitor.cs b/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultDebugPerfomenceMonitor.cs index abfbbdcb..22b85aa7 100644 --- a/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultDebugPerfomenceMonitor.cs +++ b/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultDebugPerfomenceMonitor.cs @@ -17,7 +17,7 @@ namespace OngekiFumenEditor.Kernel.Graphics.Performence [PartCreationPolicy(CreationPolicy.NonShared)] public class DefaultDebugPerfomenceMonitor : IPerfomenceMonitor { - const int RECORD_LENGTH = 10; + const int RECORD_LENGTH = 165; private class DrawingPerformenceData { @@ -130,7 +130,7 @@ private IDrawingPerformenceStatisticsData StatisticsPerformenceData(IEnumerable< return default; var ave = dataList.Select(x => x.DrawingSpendTicks.Average()).Average(); - var most = dataList.SelectMany(x => x.DrawingSpendTicks).GroupBy(x => (int)x).OrderByDescending(x => x.Key).SelectMany(x => x).Average(); + var most = dataList.SelectMany(x => x.DrawingSpendTicks).GroupBy(x => (int)x).OrderByDescending(x => x.Count()).SelectMany(x => x).Average(); var list = dataList .Select(x => new { TotalCost = x.DrawingSpendTicks.Sum(), Obj = x }) @@ -162,8 +162,8 @@ public IRenderPerformenceStatisticsData GetRenderPerformenceData() { AveSpendTicks = RenderSpendTicks.Average(), AveUIRenderSpendTicks = UIRenderSpendTicks.Average(), - MostUIRenderSpendTicks = UIRenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Key).FirstOrDefault().Key, - MostSpendTicks = RenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Key).FirstOrDefault().Key, + MostUIRenderSpendTicks = UIRenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Count()).FirstOrDefault().Key, + MostSpendTicks = RenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Count()).FirstOrDefault().Key, AveDrawCall = (int)TotalDrawCall.Average() }; } diff --git a/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultReleasePerfomenceMonitor.cs b/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultReleasePerfomenceMonitor.cs index 4cbb6821..365eb8b2 100644 --- a/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultReleasePerfomenceMonitor.cs +++ b/OngekiFumenEditor/Kernel/Graphics/Performence/DefaultReleasePerfomenceMonitor.cs @@ -50,8 +50,8 @@ public IRenderPerformenceStatisticsData GetRenderPerformenceData() { AveSpendTicks = RenderSpendTicks.Average(), AveUIRenderSpendTicks = UIRenderSpendTicks.Average(), - MostUIRenderSpendTicks = UIRenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Key).FirstOrDefault().Key, - MostSpendTicks = RenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Key).FirstOrDefault().Key, + MostUIRenderSpendTicks = UIRenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Count()).FirstOrDefault().Key, + MostSpendTicks = RenderSpendTicks.GroupBy(x => x).OrderByDescending(x => x.Count()).FirstOrDefault().Key, AveDrawCall = (int)TotalDrawCall.Average() }; } diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs index a0818d83..5e1f8381 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/ViewModels/FumenVisualEditorViewModel.Drawing.cs @@ -23,6 +23,7 @@ using OngekiFumenEditor.Properties; using OngekiFumenEditor.UI.Controls; using OngekiFumenEditor.Utils; +using OngekiFumenEditor.Utils.ObjectPool; using OpenTK.Graphics.OpenGL; using OpenTK.Mathematics; using OpenTK.Wpf; @@ -247,20 +248,30 @@ private void OnEditorRender(TimeSpan ts) //todo 可以把GroupBy()给优化掉 var renderObjects = GetDisplayableObjects(fumen, visibleTGridRanges) - .Distinct() + //.Distinct() .OfType() .GroupBy(x => x.IDShortName); + var containList = ObjectPool>>.Get(); + containList.Clear(); + foreach (var objGroup in renderObjects) { if (GetDrawingTarget(objGroup.Key) is not IFumenEditorDrawingTarget[] drawingTargets) continue; + var contain = ObjectPool>.Get(); + contain.Clear(); + + contain.AddRange(objGroup); + //contain.SortBy(x => x.TGrid); + foreach (var drawingTarget in drawingTargets) if (!drawMap.TryGetValue(drawingTarget, out var enums)) - drawMap[drawingTarget] = objGroup; + drawMap[drawingTarget] = contain; else - drawMap[drawingTarget] = enums.Concat(objGroup); + drawMap[drawingTarget] = enums.Concat(contain); + containList.Add(contain); } if (IsPreviewMode) @@ -289,14 +300,13 @@ private void OnEditorRender(TimeSpan ts) if (drawMap.TryGetValue(drawingTarget, out var drawingObjs)) { drawingTarget.Begin(this); - foreach (var obj in drawingObjs.OrderBy(x => x.TGrid)) + //all object collection has been sorted within GetDisplayableObjects() + foreach (var obj in drawingObjs/*.OrderBy(x => x.TGrid)*/) drawingTarget.Post(obj); drawingTarget.End(); } } - drawMap.Clear(); - timeSignatureHelper.DrawTimeSigntureText(this); xGridHelper.DrawXGridText(this, CachedMagneticXGridLines); judgeLineHelper.Draw(this); @@ -304,6 +314,12 @@ private void OnEditorRender(TimeSpan ts) selectingRangeHelper.Draw(this); + //clean up + drawMap.Clear(); + foreach (var contains in containList) + ObjectPool>.Return(contains); + ObjectPool>>.Return(containList); + PerfomenceMonitor.OnAfterRender(); }