From 40058f1d1978ab8c365e808166a208bcc1343830 Mon Sep 17 00:00:00 2001
From: ALEXTANG <574809918@qq.com>
Date: Wed, 10 Aug 2022 12:55:46 +0800
Subject: [PATCH] MemPool
MemPool
---
Assets/TEngine/Editor/Inspector.meta | 8 ++
.../Editor/Inspector/Base/TEngineInspector.cs | 58 ++++++++++++++
.../Inspector/Base/TEngineInspector.cs.meta | 11 +++
.../Editor/Inspector/MemPoolInspector.cs | 77 +++++++++++++++++++
.../Editor/Inspector/MemPoolInspector.cs.meta | 11 +++
.../TEngine/Runtime/Core/MemPoolComponent.cs | 23 ++++++
.../Runtime/Core/MemPoolComponent.cs.meta | 11 +++
Assets/TEngine/Runtime/Core/MemPoolMgr.cs | 16 +++-
8 files changed, 214 insertions(+), 1 deletion(-)
create mode 100644 Assets/TEngine/Editor/Inspector.meta
create mode 100644 Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs
create mode 100644 Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs.meta
create mode 100644 Assets/TEngine/Editor/Inspector/MemPoolInspector.cs
create mode 100644 Assets/TEngine/Editor/Inspector/MemPoolInspector.cs.meta
create mode 100644 Assets/TEngine/Runtime/Core/MemPoolComponent.cs
create mode 100644 Assets/TEngine/Runtime/Core/MemPoolComponent.cs.meta
diff --git a/Assets/TEngine/Editor/Inspector.meta b/Assets/TEngine/Editor/Inspector.meta
new file mode 100644
index 00000000..f8f17f80
--- /dev/null
+++ b/Assets/TEngine/Editor/Inspector.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7585e0dfc1e636344b3ba6d4642fe925
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs b/Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs
new file mode 100644
index 00000000..068b5141
--- /dev/null
+++ b/Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs
@@ -0,0 +1,58 @@
+using UnityEditor;
+
+namespace TEngine.Editor
+{
+ ///
+ /// 游戏框架 Inspector 抽象类。
+ ///
+ public abstract class TEngineInspector : UnityEditor.Editor
+ {
+ private bool m_IsCompiling = false;
+
+ ///
+ /// 绘制事件。
+ ///
+ public override void OnInspectorGUI()
+ {
+ if (m_IsCompiling && !EditorApplication.isCompiling)
+ {
+ m_IsCompiling = false;
+ OnCompileComplete();
+ }
+ else if (!m_IsCompiling && EditorApplication.isCompiling)
+ {
+ m_IsCompiling = true;
+ OnCompileStart();
+ }
+ }
+
+ ///
+ /// 编译开始事件。
+ ///
+ protected virtual void OnCompileStart()
+ {
+ }
+
+ ///
+ /// 编译完成事件。
+ ///
+ protected virtual void OnCompileComplete()
+ {
+ }
+
+ protected bool IsPrefabInHierarchy(UnityEngine.Object obj)
+ {
+ if (obj == null)
+ {
+ return false;
+ }
+
+#if UNITY_2018_3_OR_NEWER
+ return PrefabUtility.GetPrefabAssetType(obj) != PrefabAssetType.Regular;
+#else
+ return PrefabUtility.GetPrefabType(obj) != PrefabType.Prefab;
+#endif
+ }
+ }
+}
+
diff --git a/Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs.meta b/Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs.meta
new file mode 100644
index 00000000..0d5d020c
--- /dev/null
+++ b/Assets/TEngine/Editor/Inspector/Base/TEngineInspector.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 05b15d046064d604d8cbdb1c30c2617b
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TEngine/Editor/Inspector/MemPoolInspector.cs b/Assets/TEngine/Editor/Inspector/MemPoolInspector.cs
new file mode 100644
index 00000000..bd90bd70
--- /dev/null
+++ b/Assets/TEngine/Editor/Inspector/MemPoolInspector.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using UnityEditor;
+using UnityEngine;
+
+namespace TEngine.Editor
+{
+ [CustomEditor(typeof(MemPoolComponent))]
+ internal sealed class MemPoolInspector : TEngineInspector
+ {
+ private readonly HashSet m_OpenedItems = new HashSet();
+
+ public override void OnInspectorGUI()
+ {
+ base.OnInspectorGUI();
+
+ if (!EditorApplication.isPlaying)
+ {
+ EditorGUILayout.HelpBox("Available during runtime only.", MessageType.Info);
+ return;
+ }
+
+ MemPoolComponent t = (MemPoolComponent)target;
+
+ if (IsPrefabInHierarchy(t.gameObject))
+ {
+ EditorGUILayout.LabelField("Object Pool Count", t.Count.ToString());
+
+ var objectPools = t.GetAllObjectPools();
+ foreach (var objectPool in objectPools)
+ {
+ DrawObjectPool(objectPool);
+ }
+ }
+
+ Repaint();
+ }
+
+ private void OnEnable()
+ {
+ }
+
+ private void DrawObjectPool(IMemPoolBase objectPool)
+ {
+ bool lastState = m_OpenedItems.Contains(objectPool.GetName());
+ bool currentState = EditorGUILayout.Foldout(lastState, objectPool.GetName());
+ if (currentState != lastState)
+ {
+ if (currentState)
+ {
+ m_OpenedItems.Add(objectPool.GetName());
+ }
+ else
+ {
+ m_OpenedItems.Remove(objectPool.GetName());
+ }
+ }
+
+ if (currentState)
+ {
+ EditorGUILayout.BeginVertical("box");
+ {
+ EditorGUILayout.LabelField("Name", objectPool.GetName());
+ EditorGUILayout.LabelField("Type", objectPool.GetName());
+ EditorGUILayout.LabelField("Capacity", objectPool.GetPoolItemCount().ToString());
+ EditorGUILayout.LabelField("Used Count", objectPool.GetPoolItemCount().ToString());
+ EditorGUILayout.LabelField("Can Release Count", objectPool.GetPoolItemCount().ToString());
+ }
+ EditorGUILayout.EndVertical();
+
+ EditorGUILayout.Separator();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/TEngine/Editor/Inspector/MemPoolInspector.cs.meta b/Assets/TEngine/Editor/Inspector/MemPoolInspector.cs.meta
new file mode 100644
index 00000000..ab40d539
--- /dev/null
+++ b/Assets/TEngine/Editor/Inspector/MemPoolInspector.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e1793e1900fd65841aec71776ecbd91e
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TEngine/Runtime/Core/MemPoolComponent.cs b/Assets/TEngine/Runtime/Core/MemPoolComponent.cs
new file mode 100644
index 00000000..0953e6c6
--- /dev/null
+++ b/Assets/TEngine/Runtime/Core/MemPoolComponent.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace TEngine
+{
+ public class MemPoolComponent:UnitySingleton
+ {
+ public MemPoolMgr PoolMgr;
+
+ protected override void OnLoad()
+ {
+ base.OnLoad();
+ PoolMgr = MemPoolMgr.Instance;
+ }
+
+ public int Count => PoolMgr.Count;
+
+ public List GetAllObjectPools()
+ {
+ return PoolMgr.GetAllObjectPools();
+ }
+ }
+}
diff --git a/Assets/TEngine/Runtime/Core/MemPoolComponent.cs.meta b/Assets/TEngine/Runtime/Core/MemPoolComponent.cs.meta
new file mode 100644
index 00000000..6b5eee80
--- /dev/null
+++ b/Assets/TEngine/Runtime/Core/MemPoolComponent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5f83b489779008a4aaf472eb9b490ac5
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/TEngine/Runtime/Core/MemPoolMgr.cs b/Assets/TEngine/Runtime/Core/MemPoolMgr.cs
index 11b37b16..592de90a 100644
--- a/Assets/TEngine/Runtime/Core/MemPoolMgr.cs
+++ b/Assets/TEngine/Runtime/Core/MemPoolMgr.cs
@@ -18,6 +18,16 @@ namespace TEngine
public class MemPoolMgr : TSingleton
{
+ protected override void Init()
+ {
+ base.Init();
+#if UNITY_EDITOR
+ MemPoolComponent.Active();
+#endif
+ }
+
+ public int Count => m_listPool.Count;
+
List m_listPool = new List();
[Conditional("UNITY_EDITOR")]
@@ -46,6 +56,11 @@ namespace TEngine
pool.ClearPool();
}
}
+
+ public List GetAllObjectPools()
+ {
+ return m_listPool;
+ }
}
public class GameMemPool : TSingleton>, IMemPoolBase where T : IMemPoolObject, new()
@@ -114,5 +129,4 @@ namespace TEngine
return m_objPool.Count;
}
}
-
}
\ No newline at end of file