playtest-unity/playtest/Library/PackageCache/com.unity.performance.profi.../Editor/ProfileDataView.cs

173 lines
4.8 KiB
C#

using System;
using System.Collections.Generic;
namespace UnityEditor.Performance.ProfileAnalyzer
{
[Serializable]
internal class ProfileDataView
{
public string path;
public ProfileData data;
public ProfileAnalysis analysisFullNew;
public ProfileAnalysis analysisFull;
public ProfileAnalysis analysisNew;
public ProfileAnalysis analysis;
public List<int> selectedIndices = new List<int> { 0, 0 };
[NonSerialized]
public bool inSyncWithProfilerData;
public bool containsWaitForFPS { get; private set; }
public bool containsWaitForPresent { get; private set; }
public ProfileDataView()
{
}
public ProfileDataView(ProfileDataView dataView)
{
path = dataView.path;
data = dataView.data;
analysisFullNew = dataView.analysisFullNew;
analysisFull = dataView.analysisFull;
analysisNew = dataView.analysisNew;
analysis = dataView.analysis;
selectedIndices = new List<int>(dataView.selectedIndices);
inSyncWithProfilerData = dataView.inSyncWithProfilerData;
containsWaitForFPS = dataView.containsWaitForFPS;
containsWaitForPresent = dataView.containsWaitForPresent;
}
public void FindKeyMarkers()
{
containsWaitForFPS = data.GetMarkerIndex("WaitForTargetFPS") != -1;
containsWaitForPresent = data.GetMarkerIndex("Gfx.WaitForPresentOnGfxThread") != -1;
}
public bool IsDataValid()
{
if (data == null)
return false;
if (data.GetFrameCount() == 0)
return false;
if (data.NeedsMarkerRebuild)
{
if (!ProfileData.Load(data.FilePath, out data))
{
return false;
}
}
return true;
}
public bool HasValidSelection()
{
if (selectedIndices.Count == 2 && selectedIndices[0] == 0 && selectedIndices[1] == 0)
return false;
return true;
}
public bool HasSelection()
{
if (selectedIndices.Count == 0)
return false;
if (selectedIndices.Count == data.GetFrameCount())
return false;
return HasValidSelection();
}
public bool AllSelected()
{
if (selectedIndices.Count != data.GetFrameCount())
return false;
return true;
}
public int GetMaxDepth()
{
return (analysis == null) ? 1 : analysis.GetFrameSummary().maxMarkerDepth;
}
int Clamp(int value, int min, int max)
{
if (value < min)
value = min;
else if (value > max)
value = max;
return value;
}
public int ClampToValidDepthValue(int depthFilter)
{
// ProfileAnalyzer.kDepthAll is special case that we don't test for here
// If we have no depth values then return -1 for all (as clamp expects min<max)
int maxDepth = GetMaxDepth();
if (maxDepth < 1)
return ProfileAnalyzer.kDepthAll;
return Clamp(depthFilter, 1, maxDepth);
}
bool SelectAllFramesContainingMarker(string markerName, ProfileAnalysis inAnalysis)
{
if (inAnalysis == null)
return false;
selectedIndices.Clear();
MarkerData markerData = inAnalysis.GetMarkerByName(markerName);
if (markerData == null)
return true;
foreach (var frameTime in markerData.frames)
{
selectedIndices.Add(frameTime.frameIndex);
}
// Order from lowest to highest so the start/end frame display makes sense
selectedIndices.Sort();
return true;
}
public bool SelectAllFramesContainingMarker(string markerName, bool inSelection)
{
return SelectAllFramesContainingMarker(markerName, inSelection ? analysis : analysisFull);
}
int ClampToRange(int value, int min, int max)
{
if (value < min)
value = min;
if (value > max)
value = max;
return value;
}
public void ClearSelection()
{
selectedIndices.Clear();
}
public void SelectFullRange()
{
selectedIndices.Clear();
if (data == null)
return;
for (int offset = 0; offset < data.GetFrameCount(); offset++)
{
selectedIndices.Add(data.OffsetToDisplayFrame(offset));
}
}
}
}