Skip to content

Commit

Permalink
optimze render
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Sep 12, 2024
1 parent 08dd6d6 commit f3c3885
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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 })
Expand Down Expand Up @@ -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()
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -247,20 +248,30 @@ private void OnEditorRender(TimeSpan ts)
//todo 可以把GroupBy()给优化掉
var renderObjects =
GetDisplayableObjects(fumen, visibleTGridRanges)
.Distinct()
//.Distinct()
.OfType<OngekiTimelineObjectBase>()
.GroupBy(x => x.IDShortName);

var containList = ObjectPool<List<List<OngekiTimelineObjectBase>>>.Get();
containList.Clear();

foreach (var objGroup in renderObjects)
{
if (GetDrawingTarget(objGroup.Key) is not IFumenEditorDrawingTarget[] drawingTargets)
continue;

var contain = ObjectPool<List<OngekiTimelineObjectBase>>.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)
Expand Down Expand Up @@ -289,21 +300,26 @@ 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);
playerLocationHelper.Draw(this);
selectingRangeHelper.Draw(this);


//clean up
drawMap.Clear();
foreach (var contains in containList)
ObjectPool<List<OngekiTimelineObjectBase>>.Return(contains);
ObjectPool<List<List<OngekiTimelineObjectBase>>>.Return(containList);

PerfomenceMonitor.OnAfterRender();
}

Expand Down

0 comments on commit f3c3885

Please sign in to comment.