AkiraPixelWind/Assets/Axibug/Script/Runtime/Debuger/DebuggerComponent.ReferencePoolInformationWindow.cs
2022-12-29 18:20:40 +08:00

108 lines
5.3 KiB
C#

using Axibug;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Axibug.Runtime
{
public sealed partial class DebuggerComponent : GameComponent
{
private sealed class ReferencePoolInformationWindow : ScrollableDebuggerWindowBase
{
private readonly Dictionary<string, List<ReferencePoolInfo>> m_ReferencePoolInfos = new Dictionary<string, List<ReferencePoolInfo>>(StringComparer.Ordinal);
private readonly Comparison<ReferencePoolInfo> m_NormalClassNameComparer = NormalClassNameComparer;
private readonly Comparison<ReferencePoolInfo> m_FullClassNameComparer = FullClassNameComparer;
private bool m_ShowFullClassName = false;
public override void Initialize(params object[] args)
{
}
protected override void OnDrawScrollableWindow()
{
GUILayout.Label("<b>Reference Pool Information</b>");
GUILayout.BeginVertical("box");
{
DrawItem("Enable Strict Check", ReferencePool.EnableStrictCheck.ToString());
DrawItem("Reference Pool Count", ReferencePool.Count.ToString());
}
GUILayout.EndVertical();
m_ShowFullClassName = GUILayout.Toggle(m_ShowFullClassName, "Show Full Class Name");
m_ReferencePoolInfos.Clear();
ReferencePoolInfo[] referencePoolInfos = ReferencePool.GetAllReferencePoolInfos();
foreach (ReferencePoolInfo referencePoolInfo in referencePoolInfos)
{
string assemblyName = referencePoolInfo.Type.Assembly.GetName().Name;
List<ReferencePoolInfo> results = null;
if (!m_ReferencePoolInfos.TryGetValue(assemblyName, out results))
{
results = new List<ReferencePoolInfo>();
m_ReferencePoolInfos.Add(assemblyName, results);
}
results.Add(referencePoolInfo);
}
foreach (KeyValuePair<string, List<ReferencePoolInfo>> assemblyReferencePoolInfo in m_ReferencePoolInfos)
{
GUILayout.Label(Utility.Text.Format("<b>Assembly: {0}</b>", assemblyReferencePoolInfo.Key));
GUILayout.BeginVertical("box");
{
GUILayout.BeginHorizontal();
{
GUILayout.Label(m_ShowFullClassName ? "<b>Full Class Name</b>" : "<b>Class Name</b>");
GUILayout.Label("<b>Unused</b>", GUILayout.Width(60f));
GUILayout.Label("<b>Using</b>", GUILayout.Width(60f));
GUILayout.Label("<b>Acquire</b>", GUILayout.Width(60f));
GUILayout.Label("<b>Release</b>", GUILayout.Width(60f));
GUILayout.Label("<b>Add</b>", GUILayout.Width(60f));
GUILayout.Label("<b>Remove</b>", GUILayout.Width(60f));
}
GUILayout.EndHorizontal();
if (assemblyReferencePoolInfo.Value.Count > 0)
{
assemblyReferencePoolInfo.Value.Sort(m_ShowFullClassName ? m_FullClassNameComparer : m_NormalClassNameComparer);
foreach (ReferencePoolInfo referencePoolInfo in assemblyReferencePoolInfo.Value)
{
DrawReferencePoolInfo(referencePoolInfo);
}
}
else
{
GUILayout.Label("<i>Reference Pool is Empty ...</i>");
}
}
GUILayout.EndVertical();
}
}
private void DrawReferencePoolInfo(ReferencePoolInfo referencePoolInfo)
{
GUILayout.BeginHorizontal();
{
GUILayout.Label(m_ShowFullClassName ? referencePoolInfo.Type.FullName : referencePoolInfo.Type.Name);
GUILayout.Label(referencePoolInfo.UnusedReferenceCount.ToString(), GUILayout.Width(60f));
GUILayout.Label(referencePoolInfo.UsingReferenceCount.ToString(), GUILayout.Width(60f));
GUILayout.Label(referencePoolInfo.AcquireReferenceCount.ToString(), GUILayout.Width(60f));
GUILayout.Label(referencePoolInfo.ReleaseReferenceCount.ToString(), GUILayout.Width(60f));
GUILayout.Label(referencePoolInfo.AddReferenceCount.ToString(), GUILayout.Width(60f));
GUILayout.Label(referencePoolInfo.RemoveReferenceCount.ToString(), GUILayout.Width(60f));
}
GUILayout.EndHorizontal();
}
private static int NormalClassNameComparer(ReferencePoolInfo a, ReferencePoolInfo b)
{
return a.Type.Name.CompareTo(b.Type.Name);
}
private static int FullClassNameComparer(ReferencePoolInfo a, ReferencePoolInfo b)
{
return a.Type.FullName.CompareTo(b.Type.FullName);
}
}
}
}