151 lines
7.3 KiB
C#
151 lines
7.3 KiB
C#
using AlicizaX;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace AlicizaX.Editor
|
|
{
|
|
[CustomEditor(typeof(MemoryPoolSetting))]
|
|
internal sealed class MemoryPoolComponentInspector : GameFrameworkInspector
|
|
{
|
|
private readonly Dictionary<string, List<MemoryPoolInfo>> m_ReferencePoolInfos = new Dictionary<string, List<MemoryPoolInfo>>(StringComparer.Ordinal);
|
|
private readonly HashSet<string> m_OpenedItems = new HashSet<string>();
|
|
|
|
private SerializedProperty m_EnableStrictCheck = null;
|
|
|
|
private bool m_ShowFullClassName = false;
|
|
|
|
public override void OnInspectorGUI()
|
|
{
|
|
base.OnInspectorGUI();
|
|
|
|
serializedObject.Update();
|
|
|
|
MemoryPoolSetting t = (MemoryPoolSetting)target;
|
|
|
|
if (EditorApplication.isPlaying && IsPrefabInHierarchy(t.gameObject))
|
|
{
|
|
bool enableStrictCheck = EditorGUILayout.Toggle("Enable Strict Check", t.EnableStrictCheck);
|
|
if (enableStrictCheck != t.EnableStrictCheck)
|
|
{
|
|
t.EnableStrictCheck = enableStrictCheck;
|
|
}
|
|
|
|
EditorGUILayout.LabelField("Reference Pool Count", MemoryPool.Count.ToString());
|
|
m_ShowFullClassName = EditorGUILayout.Toggle("Show Full Class Name", m_ShowFullClassName);
|
|
m_ReferencePoolInfos.Clear();
|
|
MemoryPoolInfo[] referencePoolInfos = MemoryPool.GetAllMemoryPoolInfos();
|
|
foreach (MemoryPoolInfo referencePoolInfo in referencePoolInfos)
|
|
{
|
|
string assemblyName = referencePoolInfo.Type.Assembly.GetName().Name;
|
|
List<MemoryPoolInfo> results = null;
|
|
if (!m_ReferencePoolInfos.TryGetValue(assemblyName, out results))
|
|
{
|
|
results = new List<MemoryPoolInfo>();
|
|
m_ReferencePoolInfos.Add(assemblyName, results);
|
|
}
|
|
|
|
results.Add(referencePoolInfo);
|
|
}
|
|
|
|
foreach (KeyValuePair<string, List<MemoryPoolInfo>> assemblyReferencePoolInfo in m_ReferencePoolInfos)
|
|
{
|
|
bool lastState = m_OpenedItems.Contains(assemblyReferencePoolInfo.Key);
|
|
bool currentState = EditorGUILayout.Foldout(lastState, assemblyReferencePoolInfo.Key);
|
|
if (currentState != lastState)
|
|
{
|
|
if (currentState)
|
|
{
|
|
m_OpenedItems.Add(assemblyReferencePoolInfo.Key);
|
|
}
|
|
else
|
|
{
|
|
m_OpenedItems.Remove(assemblyReferencePoolInfo.Key);
|
|
}
|
|
}
|
|
|
|
if (currentState)
|
|
{
|
|
EditorGUILayout.BeginVertical("box");
|
|
{
|
|
var label = "Unused\tUsing.\tAcquire\tRelease\tAdd\tRemove";
|
|
EditorGUILayout.LabelField(m_ShowFullClassName ? "Full Class Name" : "Class Name", label);
|
|
assemblyReferencePoolInfo.Value.Sort(Comparison);
|
|
foreach (MemoryPoolInfo referencePoolInfo in assemblyReferencePoolInfo.Value)
|
|
{
|
|
DrawReferencePoolInfo(referencePoolInfo);
|
|
}
|
|
|
|
if (GUILayout.Button("Export CSV Data"))
|
|
{
|
|
string exportFileName = EditorUtility.SaveFilePanel("Export CSV Data", string.Empty, Utility.Text.Format("Reference Pool Data - {0}.csv", assemblyReferencePoolInfo.Key), string.Empty);
|
|
if (!string.IsNullOrEmpty(exportFileName))
|
|
{
|
|
try
|
|
{
|
|
int index = 0;
|
|
string[] data = new string[assemblyReferencePoolInfo.Value.Count + 1];
|
|
data[index++] = "Class Name,Full Class Name,Unused,Using,Acquire,Release,Add,Remove";
|
|
foreach (MemoryPoolInfo referencePoolInfo in assemblyReferencePoolInfo.Value)
|
|
{
|
|
data[index++] = Utility.Text.Format("{0},{1},{2},{3},{4},{5},{6},{7}", referencePoolInfo.Type.Name, referencePoolInfo.Type.FullName, referencePoolInfo.UnusedMemoryCount, referencePoolInfo.UsingMemoryCount, referencePoolInfo.AcquireMemoryCount, referencePoolInfo.ReleaseMemoryCount, referencePoolInfo.AddMemoryCount, referencePoolInfo.RemoveMemoryCount);
|
|
}
|
|
|
|
File.WriteAllLines(exportFileName, data, Encoding.UTF8);
|
|
Debug.Log(Utility.Text.Format("Export reference pool CSV data to '{0}' success.", exportFileName));
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
Debug.LogError(Utility.Text.Format("Export reference pool CSV data to '{0}' failure, exception is '{1}'.", exportFileName, exception));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
EditorGUILayout.EndVertical();
|
|
|
|
EditorGUILayout.Separator();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
EditorGUILayout.PropertyField(m_EnableStrictCheck);
|
|
}
|
|
|
|
serializedObject.ApplyModifiedProperties();
|
|
|
|
Repaint();
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
m_EnableStrictCheck = serializedObject.FindProperty("m_EnableStrictCheck");
|
|
}
|
|
|
|
private void DrawReferencePoolInfo(MemoryPoolInfo referencePoolInfo)
|
|
{
|
|
#if UNITY_6000_0_OR_NEWER
|
|
EditorGUILayout.LabelField(m_ShowFullClassName ? referencePoolInfo.Type.FullName : referencePoolInfo.Type.Name, Utility.Text.Format("{0,-12}\t{1,-12}\t{2,-12}\t{3,-12}\t{4}\t{5}", referencePoolInfo.UnusedMemoryCount, referencePoolInfo.UsingMemoryCount, referencePoolInfo.AcquireMemoryCount, referencePoolInfo.ReleaseMemoryCount, referencePoolInfo.AddMemoryCount, referencePoolInfo.RemoveMemoryCount));
|
|
#else
|
|
EditorGUILayout.LabelField(m_ShowFullClassName ? referencePoolInfo.Type.FullName :
|
|
referencePoolInfo.Type.Name, Utility.Text.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}",referencePoolInfo.UnusedMemoryCount, referencePoolInfo.UsingMemoryCount, referencePoolInfo.AcquireMemoryCount, referencePoolInfo.ReleaseMemoryCount, referencePoolInfo.AddMemoryCount, referencePoolInfo.RemoveMemoryCount));
|
|
#endif
|
|
}
|
|
|
|
private int Comparison(MemoryPoolInfo a, MemoryPoolInfo b)
|
|
{
|
|
if (m_ShowFullClassName)
|
|
{
|
|
return a.Type.FullName.CompareTo(b.Type.FullName);
|
|
}
|
|
else
|
|
{
|
|
return a.Type.Name.CompareTo(b.Type.Name);
|
|
}
|
|
}
|
|
}
|
|
}
|