* Added some internal caching for Enum Names, should vastly improve speed when inspecting certain classes (worst case scenario I found went from over 50 seconds to less than 1 second).
* ILRepack is now done as part of the build process, should simplify things if you are building the project yourself.
This commit is contained in:
sinaioutlander 2020-10-05 20:25:25 +11:00
parent 912b1b80ff
commit b8b6cc1605
6 changed files with 58 additions and 28 deletions

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using UnityEngine; using UnityEngine;
#if CPP #if CPP
using UnhollowerBaseLib; using UnhollowerBaseLib;
@ -15,8 +16,8 @@ namespace Explorer
public PageHelper Pages = new PageHelper(); public PageHelper Pages = new PageHelper();
private CacheObjectBase[] m_cachedKeys; private CacheObjectBase[] m_cachedKeys = new CacheObjectBase[0];
private CacheObjectBase[] m_cachedValues; private CacheObjectBase[] m_cachedValues = new CacheObjectBase[0];
public Type TypeOfKeys public Type TypeOfKeys
{ {
@ -119,6 +120,11 @@ namespace Explorer
base.UpdateValue(); base.UpdateValue();
CacheEntries();
}
public void CacheEntries()
{
// reset // reset
IDict = null; IDict = null;
@ -190,8 +196,6 @@ namespace Explorer
var whitespace = CalcWhitespace(window); var whitespace = CalcWhitespace(window);
int count = m_cachedKeys.Length;
if (!IsExpanded) if (!IsExpanded)
{ {
if (GUILayout.Button("v", new GUILayoutOption[] { GUILayout.Width(25) })) if (GUILayout.Button("v", new GUILayoutOption[] { GUILayout.Width(25) }))
@ -209,6 +213,8 @@ namespace Explorer
var negativeWhitespace = window.width - (whitespace + 100f); var negativeWhitespace = window.width - (whitespace + 100f);
int count = m_cachedKeys.Length;
GUI.skin.button.alignment = TextAnchor.MiddleLeft; GUI.skin.button.alignment = TextAnchor.MiddleLeft;
string btnLabel = $"[{count}] <color=#2df7b2>Dictionary<{TypeOfKeys.FullName}, {TypeOfValues.FullName}></color>"; string btnLabel = $"[{count}] <color=#2df7b2>Dictionary<{TypeOfKeys.FullName}, {TypeOfValues.FullName}></color>";
if (GUILayout.Button(btnLabel, new GUILayoutOption[] { GUILayout.Width(negativeWhitespace) })) if (GUILayout.Button(btnLabel, new GUILayoutOption[] { GUILayout.Width(negativeWhitespace) }))
@ -260,21 +266,27 @@ namespace Explorer
//GUIUnstrip.Space(whitespace); //GUIUnstrip.Space(whitespace);
if (key == null || val == null) if (key == null && val == null)
{ {
GUILayout.Label($"[{i}] <i><color=grey>(null)</color></i>", new GUILayoutOption[0]); GUILayout.Label($"[{i}] <i><color=grey>(null)</color></i>", new GUILayoutOption[0]);
} }
else else
{ {
GUI.skin.label.alignment = TextAnchor.MiddleCenter; GUI.skin.label.alignment = TextAnchor.MiddleCenter;
GUILayout.Label($"[{i}]", new GUILayoutOption[] { GUILayout.Width(30) }); GUILayout.Label($"[{i}]", new GUILayoutOption[] { GUILayout.Width(40) });
GUI.skin.label.alignment = TextAnchor.MiddleLeft; GUI.skin.label.alignment = TextAnchor.MiddleLeft;
GUILayout.Label("Key:", new GUILayoutOption[] { GUILayout.Width(40) }); GUILayout.Label("Key:", new GUILayoutOption[] { GUILayout.Width(40) });
if (key != null)
key.DrawValue(window, (window.width / 2) - 80f); key.DrawValue(window, (window.width / 2) - 80f);
else
GUILayout.Label("<i>null</i>", new GUILayoutOption[0]);
GUILayout.Label("Value:", new GUILayoutOption[] { GUILayout.Width(40) }); GUILayout.Label("Value:", new GUILayoutOption[] { GUILayout.Width(40) });
if (Value != null)
val.DrawValue(window, (window.width / 2) - 80f); val.DrawValue(window, (window.width / 2) - 80f);
else
GUILayout.Label("<i>null</i>", new GUILayoutOption[0]);
} }
} }

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using System.Reflection; using System.Reflection;
using UnityEngine; using UnityEngine;
@ -13,7 +14,7 @@ namespace Explorer
public PageHelper Pages = new PageHelper(); public PageHelper Pages = new PageHelper();
private CacheObjectBase[] m_cachedEntries; private CacheObjectBase[] m_cachedEntries = new CacheObjectBase[0];
// Type of Entries in the Array // Type of Entries in the Array
public Type EntryType public Type EntryType
@ -218,6 +219,11 @@ namespace Explorer
return; return;
} }
CacheEntries();
}
public void CacheEntries()
{
var enumerator = Enumerable.GetEnumerator(); var enumerator = Enumerable.GetEnumerator();
if (enumerator == null) if (enumerator == null)
{ {
@ -276,8 +282,6 @@ namespace Explorer
var whitespace = CalcWhitespace(window); var whitespace = CalcWhitespace(window);
int count = m_cachedEntries.Length;
if (!IsExpanded) if (!IsExpanded)
{ {
if (GUILayout.Button("v", new GUILayoutOption[] { GUILayout.Width(25) })) if (GUILayout.Button("v", new GUILayoutOption[] { GUILayout.Width(25) }))
@ -295,6 +299,8 @@ namespace Explorer
var negativeWhitespace = window.width - (whitespace + 100f); var negativeWhitespace = window.width - (whitespace + 100f);
int count = m_cachedEntries.Length;
GUI.skin.button.alignment = TextAnchor.MiddleLeft; GUI.skin.button.alignment = TextAnchor.MiddleLeft;
string btnLabel = $"[{count}] <color=#2df7b2>{EntryType.FullName}</color>"; string btnLabel = $"[{count}] <color=#2df7b2>{EntryType.FullName}</color>";
if (GUILayout.Button(btnLabel, new GUILayoutOption[] { GUILayout.Width(negativeWhitespace) })) if (GUILayout.Button(btnLabel, new GUILayoutOption[] { GUILayout.Width(negativeWhitespace) }))

View File

@ -9,6 +9,8 @@ namespace Explorer
{ {
public class CacheEnum : CacheObjectBase public class CacheEnum : CacheObjectBase
{ {
internal static Dictionary<Type, string[]> EnumNamesInternalCache = new Dictionary<Type, string[]>();
// public Type EnumType; // public Type EnumType;
public string[] EnumNames = new string[0]; public string[] EnumNames = new string[0];
@ -21,18 +23,7 @@ namespace Explorer
if (ValueType != null) if (ValueType != null)
{ {
// using GetValues not GetNames, to catch instances of weird enums (eg CameraClearFlags) GetNames();
var values = Enum.GetValues(ValueType);
var list = new List<string>();
foreach (var value in values)
{
var v = value.ToString();
if (list.Contains(v)) continue;
list.Add(v);
}
EnumNames = list.ToArray();
} }
else else
{ {
@ -40,6 +31,27 @@ namespace Explorer
} }
} }
internal void GetNames()
{
if (!EnumNamesInternalCache.ContainsKey(ValueType))
{
// using GetValues not GetNames, to catch instances of weird enums (eg CameraClearFlags)
var values = Enum.GetValues(ValueType);
var set = new HashSet<string>();
foreach (var value in values)
{
var v = value.ToString();
if (set.Contains(v)) continue;
set.Add(v);
}
EnumNamesInternalCache.Add(ValueType, set.ToArray());
}
EnumNames = EnumNamesInternalCache[ValueType];
}
public override void DrawValue(Rect window, float width) public override void DrawValue(Rect window, float width)
{ {
if (CanWrite) if (CanWrite)

View File

@ -28,11 +28,11 @@
<!-- Set this to the MelonLoader Il2Cpp Game folder, without the ending '\' character. --> <!-- Set this to the MelonLoader Il2Cpp Game folder, without the ending '\' character. -->
<MLCppGameFolder>D:\Steam\steamapps\common\Hellpoint</MLCppGameFolder> <MLCppGameFolder>D:\Steam\steamapps\common\Hellpoint</MLCppGameFolder>
<!-- Set this to the MelonLoader Mono Game folder, without the ending '\' character. --> <!-- Set this to the MelonLoader Mono Game folder, without the ending '\' character. -->
<MLMonoGameFolder>D:\Steam\steamapps\common\Outward_Mono</MLMonoGameFolder> <MLMonoGameFolder>D:\Steam\steamapps\common\Outward</MLMonoGameFolder>
<!-- Set this to the BepInEx Il2Cpp Game folder, without the ending '\' character. --> <!-- Set this to the BepInEx Il2Cpp Game folder, without the ending '\' character. -->
<BIECppGameFolder>D:\Steam\steamapps\common\Outward</BIECppGameFolder> <BIECppGameFolder>D:\Steam\steamapps\common\Outward_Il2Cpp</BIECppGameFolder>
<!-- Set this to the BepInEx Mono Game folder, without the ending '\' character. --> <!-- Set this to the BepInEx Mono Game folder, without the ending '\' character. -->
<BIEMonoGameFolder>D:\Steam\steamapps\common\Outward_Mono</BIEMonoGameFolder> <BIEMonoGameFolder>D:\Steam\steamapps\common\Outward</BIEMonoGameFolder>
<NuGetPackageImportStamp> <NuGetPackageImportStamp>
</NuGetPackageImportStamp> </NuGetPackageImportStamp>
</PropertyGroup> </PropertyGroup>

View File

@ -32,7 +32,7 @@ namespace Explorer
#if ML #if ML
GUILayout.Button(gcDrag, GUI.skin.label, new GUILayoutOption[] { GUILayout.Height(15) }); GUILayout.Button(gcDrag, GUI.skin.label, new GUILayoutOption[] { GUILayout.Height(15) });
#else #else
GUILayout.Button(gcDrag.ToString(), new GUILayoutOption[] { GUILayout.Height(15) }); GUILayout.Button("<-- Drag to resize -->", new GUILayoutOption[] { GUILayout.Height(15) });
#endif #endif
//var r = GUILayoutUtility.GetLastRect(); //var r = GUILayoutUtility.GetLastRect();

View File

@ -202,7 +202,7 @@ namespace Explorer
continue; continue;
} }
// ExplorerCore.Log($"Trying to cache member {signature}..."); //ExplorerCore.Log($"Trying to cache member {sig}...");
try try
{ {