com.alicizax.unity.framework/Runtime/Debugger/DebuggerComponent.cs
陈思海 6397cc03b2 框架大更新
1.进步优化UI系统 加载问题 性能问题 Canvas重绘问题 边界处理问题
2.优化对象池和游戏对象池的性能 游戏对象池根据窗口 策略定期清理
3.优化整个AppService 和ServiceWorld结构 固定三大类 具体参考代码
2026-03-31 17:25:20 +08:00

421 lines
18 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using UnityEngine;
using Object = UnityEngine.Object;
namespace AlicizaX.Debugger.Runtime
{
/// <summary>
/// 调试器组件�
/// </summary>
[DisallowMultipleComponent]
[AddComponentMenu("Game Framework/Debugger")]
public sealed partial class DebuggerComponent : MonoBehaviour
{
private static DebuggerComponent _instance;
public static DebuggerComponent Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<DebuggerComponent>();
}
return _instance;
}
}
/// <summary>
/// é»˜è®¤è°ƒè¯•å™¨æ¼æµ®æ¡†å¤§å°<C3A5>ã€?
/// </summary>
internal static readonly Rect DefaultIconRect = new Rect(10f, 10f, 60f, 60f);
/// <summary>
/// 默认调试器窗å<E28094>£å¤§å°<C3A5>ã€?
/// </summary>
internal static readonly Rect DefaultWindowRect = new Rect(10f, 10f, 640f, 480f);
/// <summary>
/// 默认调试器窗å<E28094>£ç¼©æ”¾æ¯”ä¾ã€?
/// </summary>
internal static readonly float DefaultWindowScale = 1f;
// private static readonly TextEditor s_TextEditor = new TextEditor();
private IDebuggerService _mDebuggerService = null;
private Rect m_DragRect = new Rect(0f, 0f, float.MaxValue, 25f);
private Rect m_IconRect = DefaultIconRect;
private Rect m_WindowRect = DefaultWindowRect;
private float m_WindowScale = DefaultWindowScale;
[SerializeField] private GUISkin m_Skin = null;
[SerializeField] private DebuggerActiveWindowType m_ActiveWindow = DebuggerActiveWindowType.AlwaysOpen;
[SerializeField] private bool m_ShowFullWindow = false;
[SerializeField] private ConsoleWindow m_ConsoleWindow = new ConsoleWindow();
private SystemInformationWindow m_SystemInformationWindow = new SystemInformationWindow();
private EnvironmentInformationWindow m_EnvironmentInformationWindow = new EnvironmentInformationWindow();
private ScreenInformationWindow m_ScreenInformationWindow = new ScreenInformationWindow();
private GraphicsInformationWindow m_GraphicsInformationWindow = new GraphicsInformationWindow();
private InputSummaryInformationWindow m_InputSummaryInformationWindow = new InputSummaryInformationWindow();
private InputTouchInformationWindow m_InputTouchInformationWindow = new InputTouchInformationWindow();
private InputLocationInformationWindow m_InputLocationInformationWindow = new InputLocationInformationWindow();
private InputAccelerationInformationWindow m_InputAccelerationInformationWindow = new InputAccelerationInformationWindow();
private InputGyroscopeInformationWindow m_InputGyroscopeInformationWindow = new InputGyroscopeInformationWindow();
private InputCompassInformationWindow m_InputCompassInformationWindow = new InputCompassInformationWindow();
private PathInformationWindow m_PathInformationWindow = new PathInformationWindow();
private SceneInformationWindow m_SceneInformationWindow = new SceneInformationWindow();
private TimeInformationWindow m_TimeInformationWindow = new TimeInformationWindow();
private QualityInformationWindow m_QualityInformationWindow = new QualityInformationWindow();
private ProfilerInformationWindow m_ProfilerInformationWindow = new ProfilerInformationWindow();
private WebPlayerInformationWindow m_WebPlayerInformationWindow = new WebPlayerInformationWindow();
private RuntimeMemorySummaryWindow m_RuntimeMemorySummaryWindow = new RuntimeMemorySummaryWindow();
private RuntimeMemoryInformationWindow<Object> m_RuntimeMemoryAllInformationWindow = new RuntimeMemoryInformationWindow<Object>();
private RuntimeMemoryInformationWindow<Texture> m_RuntimeMemoryTextureInformationWindow = new RuntimeMemoryInformationWindow<Texture>();
private RuntimeMemoryInformationWindow<Mesh> m_RuntimeMemoryMeshInformationWindow = new RuntimeMemoryInformationWindow<Mesh>();
private RuntimeMemoryInformationWindow<Material> m_RuntimeMemoryMaterialInformationWindow = new RuntimeMemoryInformationWindow<Material>();
private RuntimeMemoryInformationWindow<Shader> m_RuntimeMemoryShaderInformationWindow = new RuntimeMemoryInformationWindow<Shader>();
private RuntimeMemoryInformationWindow<AnimationClip> m_RuntimeMemoryAnimationClipInformationWindow = new RuntimeMemoryInformationWindow<AnimationClip>();
private RuntimeMemoryInformationWindow<AudioClip> m_RuntimeMemoryAudioClipInformationWindow = new RuntimeMemoryInformationWindow<AudioClip>();
private RuntimeMemoryInformationWindow<Font> m_RuntimeMemoryFontInformationWindow = new RuntimeMemoryInformationWindow<Font>();
private RuntimeMemoryInformationWindow<TextAsset> m_RuntimeMemoryTextAssetInformationWindow = new RuntimeMemoryInformationWindow<TextAsset>();
private RuntimeMemoryInformationWindow<ScriptableObject> m_RuntimeMemoryScriptableObjectInformationWindow = new RuntimeMemoryInformationWindow<ScriptableObject>();
private ObjectPoolInformationWindow m_ObjectPoolInformationWindow = new ObjectPoolInformationWindow();
private ReferencePoolInformationWindow m_ReferencePoolInformationWindow = new ReferencePoolInformationWindow();
//private NetworkInformationWindow m_NetworkInformationWindow = new NetworkInformationWindow();
private SettingsWindow m_SettingsWindow = new SettingsWindow();
//private OperationsWindow m_OperationsWindow = new OperationsWindow();
private FpsCounter m_FpsCounter = null;
/// <summary>
/// 获å<C2B7>æˆè®¾ç½®è°ƒè¯•器窗å<E28094>£æ˜¯å<C2AF>¦æ¿€æ´»ã€?
/// </summary>
public bool ActiveWindow
{
get { return _mDebuggerService.ActiveWindow; }
set
{
_mDebuggerService.ActiveWindow = value;
enabled = value;
}
}
/// <summary>
/// 获å<C2B7>æˆè®¾ç½®æ˜¯å<C2AF>¦æ˜¾ç¤ºå®Œæ•´è°ƒè¯•器界é<C592>¢ã€?
/// </summary>
public bool ShowFullWindow
{
get { return m_ShowFullWindow; }
set { m_ShowFullWindow = value; }
}
/// <summary>
/// 获å<C2B7>æˆè®¾ç½®è°ƒè¯•å™¨æ¼æµ®æ¡†å¤§å°<C3A5>ã€?
/// </summary>
public Rect IconRect
{
get { return m_IconRect; }
set { m_IconRect = value; }
}
/// <summary>
/// 获å<C2B7>æˆè®¾ç½®è°ƒè¯•器窗å<E28094>£å¤§å°<C3A5>ã€?
/// </summary>
public Rect WindowRect
{
get { return m_WindowRect; }
set { m_WindowRect = value; }
}
/// <summary>
/// 获å<C2B7>æˆè®¾ç½®è°ƒè¯•器窗å<E28094>£ç¼©æ”¾æ¯”ä¾ã€?
/// </summary>
public float WindowScale
{
get { return m_WindowScale; }
set { m_WindowScale = value; }
}
/// <summary>
/// 游æˆ<C3A6>框架组件åˆ<C3A5>å§åŒã€?
/// </summary>
private void Awake()
{
_instance = this;
_mDebuggerService = AppServices.App.Register(new DebuggerService());
if (_mDebuggerService == null)
{
Log.Error("Debugger manager is invalid.");
return;
}
m_FpsCounter = new FpsCounter(0.5f);
}
internal void SetActiveMode(DebuggerActiveWindowType activeWindowType)
{
m_ActiveWindow = activeWindowType;
}
private void Start()
{
if (m_Skin == null)
{
Debug.LogWarning("DebugComponent GUI SKin Is Null!");
}
RegisterDebuggerWindow("Console", m_ConsoleWindow);
RegisterDebuggerWindow("Information/System", m_SystemInformationWindow);
RegisterDebuggerWindow("Information/Environment", m_EnvironmentInformationWindow);
RegisterDebuggerWindow("Information/Screen", m_ScreenInformationWindow);
RegisterDebuggerWindow("Information/Graphics", m_GraphicsInformationWindow);
RegisterDebuggerWindow("Information/Input/Summary", m_InputSummaryInformationWindow);
RegisterDebuggerWindow("Information/Input/Touch", m_InputTouchInformationWindow);
RegisterDebuggerWindow("Information/Input/Location", m_InputLocationInformationWindow);
RegisterDebuggerWindow("Information/Input/Acceleration", m_InputAccelerationInformationWindow);
RegisterDebuggerWindow("Information/Input/Gyroscope", m_InputGyroscopeInformationWindow);
RegisterDebuggerWindow("Information/Input/Compass", m_InputCompassInformationWindow);
RegisterDebuggerWindow("Information/Other/Scene", m_SceneInformationWindow);
RegisterDebuggerWindow("Information/Other/Path", m_PathInformationWindow);
RegisterDebuggerWindow("Information/Other/Time", m_TimeInformationWindow);
RegisterDebuggerWindow("Information/Other/Quality", m_QualityInformationWindow);
RegisterDebuggerWindow("Information/Other/Web Player", m_WebPlayerInformationWindow);
RegisterDebuggerWindow("Profiler/Summary", m_ProfilerInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/Summary", m_RuntimeMemorySummaryWindow);
RegisterDebuggerWindow("Profiler/Memory/All", m_RuntimeMemoryAllInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/Texture", m_RuntimeMemoryTextureInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/Mesh", m_RuntimeMemoryMeshInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/Material", m_RuntimeMemoryMaterialInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/Shader", m_RuntimeMemoryShaderInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/AnimationClip", m_RuntimeMemoryAnimationClipInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/AudioClip", m_RuntimeMemoryAudioClipInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/Font", m_RuntimeMemoryFontInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/TextAsset", m_RuntimeMemoryTextAssetInformationWindow);
RegisterDebuggerWindow("Profiler/Memory/ScriptableObject", m_RuntimeMemoryScriptableObjectInformationWindow);
RegisterDebuggerWindow("Profiler/Object Pool", m_ObjectPoolInformationWindow);
RegisterDebuggerWindow("Profiler/Reference Pool", m_ReferencePoolInformationWindow);
//RegisterDebuggerWindow("Profiler/Network", m_NetworkInformationWindow);
RegisterDebuggerWindow("Other/Settings", m_SettingsWindow);
//RegisterDebuggerWindow("Other/Operations", m_OperationsWindow);
switch (m_ActiveWindow)
{
case DebuggerActiveWindowType.AlwaysOpen:
ActiveWindow = true;
break;
case DebuggerActiveWindowType.OnlyOpenWhenDevelopment:
ActiveWindow = Debug.isDebugBuild;
break;
case DebuggerActiveWindowType.OnlyOpenInEditor:
ActiveWindow = Application.isEditor;
break;
default:
ActiveWindow = false;
break;
}
}
private void Update()
{
m_FpsCounter.Update(Time.deltaTime, Time.unscaledDeltaTime);
}
private void OnGUI()
{
if (_mDebuggerService == null || !_mDebuggerService.ActiveWindow)
{
return;
}
GUISkin cachedGuiSkin = GUI.skin;
Matrix4x4 cachedMatrix = GUI.matrix;
GUI.skin = m_Skin;
GUI.matrix = Matrix4x4.Scale(new Vector3(m_WindowScale, m_WindowScale, 1f));
if (m_ShowFullWindow)
{
m_WindowRect = GUILayout.Window(0, m_WindowRect, DrawWindow, "<b>GAME FRAMEWORK DEBUGGER</b>");
}
else
{
m_IconRect = GUILayout.Window(0, m_IconRect, DrawDebuggerWindowIcon, "<b>DEBUGGER</b>");
}
GUI.matrix = cachedMatrix;
GUI.skin = cachedGuiSkin;
}
/// <summary>
/// 注册调试器窗å<E28094>£ã€?
/// </summary>
/// <param name="path">调试器窗å<E28094>£è·¯å¾„ã€?/param>
/// <param name="debuggerWindow">è¦<C3A8>注册的调试器窗å<E28094>£ã€?/param>
/// <param name="args">åˆ<C3A5>å§åŒè°ƒè¯•器窗å<E28094>£å<C2A3>æ•°ã€?/param>
public void RegisterDebuggerWindow(string path, IDebuggerWindow debuggerWindow, params object[] args)
{
_mDebuggerService.RegisterDebuggerWindow(path, debuggerWindow, args);
}
/// <summary>
/// 解除注册调试器窗å<E28094>£ã€?
/// </summary>
/// <param name="path">调试器窗å<E28094>£è·¯å¾„ã€?/param>
/// <returns>是å<C2AF>¦è§£é™¤æ³¨å†Œè°ƒè¯•器窗å<E28094>£æˆ<C3A6>功ã€?/returns>
public bool UnregisterDebuggerWindow(string path)
{
return _mDebuggerService.UnregisterDebuggerWindow(path);
}
/// <summary>
/// 获å<C2B7>调试器窗å<E28094>£ã€?
/// </summary>
/// <param name="path">调试器窗å<E28094>£è·¯å¾„ã€?/param>
/// <returns>è¦<C3A8>获å<C2B7>的调试器窗å<E28094>£ã€?/returns>
public IDebuggerWindow GetDebuggerWindow(string path)
{
return _mDebuggerService.GetDebuggerWindow(path);
}
/// <summary>
/// 选中调试器窗å<E28094>£ã€?
/// </summary>
/// <param name="path">调试器窗å<E28094>£è·¯å¾„ã€?/param>
/// <returns>是å<C2AF>¦æˆ<C3A6>功选中调试器窗å<E28094>£ã€?/returns>
public bool SelectDebuggerWindow(string path)
{
return _mDebuggerService.SelectDebuggerWindow(path);
}
/// <summary>
/// 还原调试器窗å<E28094>£å¸ƒå±€ã€?
/// </summary>
public void ResetLayout()
{
IconRect = DefaultIconRect;
WindowRect = DefaultWindowRect;
WindowScale = DefaultWindowScale;
}
/// <summary>
/// 获å<C2B7>记录的所有日志ã€?
/// </summary>
/// <param name="results">è¦<C3A8>获å<C2B7>的日志ã€?/param>
public void GetRecentLogs(List<LogNode> results)
{
m_ConsoleWindow.GetRecentLogs(results);
}
/// <summary>
/// 获å<C2B7>è®°å½•çš„æœ€è¿æ—¥å¿—ã€?
/// </summary>
/// <param name="results">è¦<C3A8>获å<C2B7>的日志ã€?/param>
/// <param name="count">è¦<C3A8>获å<C2B7>æœ€è¿æ—¥å¿—的数é‡<C3A9>ã€?/param>
public void GetRecentLogs(List<LogNode> results, int count)
{
m_ConsoleWindow.GetRecentLogs(results, count);
}
private void DrawWindow(int windowId)
{
GUI.DragWindow(m_DragRect);
DrawDebuggerWindowGroup(_mDebuggerService.DebuggerWindowRoot);
}
private void DrawDebuggerWindowGroup(IDebuggerWindowGroup debuggerWindowGroup)
{
if (debuggerWindowGroup == null)
{
return;
}
List<string> names = new List<string>();
string[] debuggerWindowNames = debuggerWindowGroup.GetDebuggerWindowNames();
for (int i = 0; i < debuggerWindowNames.Length; i++)
{
names.Add(Utility.Text.Format("<b>{0}</b>", debuggerWindowNames[i]));
}
if (debuggerWindowGroup == _mDebuggerService.DebuggerWindowRoot)
{
names.Add("<b>Close</b>");
}
int toolbarIndex = GUILayout.Toolbar(debuggerWindowGroup.SelectedIndex, names.ToArray(), GUILayout.Height(30f), GUILayout.MaxWidth(Screen.width));
if (toolbarIndex >= debuggerWindowGroup.DebuggerWindowCount)
{
m_ShowFullWindow = false;
return;
}
if (debuggerWindowGroup.SelectedWindow == null)
{
return;
}
if (debuggerWindowGroup.SelectedIndex != toolbarIndex)
{
debuggerWindowGroup.SelectedWindow.OnLeave();
debuggerWindowGroup.SelectedIndex = toolbarIndex;
debuggerWindowGroup.SelectedWindow.OnEnter();
}
IDebuggerWindowGroup subDebuggerWindowGroup = debuggerWindowGroup.SelectedWindow as IDebuggerWindowGroup;
if (subDebuggerWindowGroup != null)
{
DrawDebuggerWindowGroup(subDebuggerWindowGroup);
}
debuggerWindowGroup.SelectedWindow.OnDraw();
}
private void DrawDebuggerWindowIcon(int windowId)
{
GUI.DragWindow(m_DragRect);
GUILayout.Space(5);
Color32 color = Color.white;
m_ConsoleWindow.RefreshCount();
if (m_ConsoleWindow.FatalCount > 0)
{
color = m_ConsoleWindow.GetLogStringColor(LogType.Exception);
}
else if (m_ConsoleWindow.ErrorCount > 0)
{
color = m_ConsoleWindow.GetLogStringColor(LogType.Error);
}
else if (m_ConsoleWindow.WarningCount > 0)
{
color = m_ConsoleWindow.GetLogStringColor(LogType.Warning);
}
else
{
color = m_ConsoleWindow.GetLogStringColor(LogType.Log);
}
string title = Utility.Text.Format("<color=#{0:x2}{1:x2}{2:x2}{3:x2}><b>FPS: {4:F2}</b></color>", color.r, color.g, color.b, color.a, m_FpsCounter.CurrentFps);
if (GUILayout.Button(title, GUILayout.Width(100f), GUILayout.Height(40f)))
{
m_ShowFullWindow = true;
}
}
private static void CopyToClipboard(string content)
{
// s_TextEditor.text = content;
// s_TextEditor.OnFocus();
// s_TextEditor.Copy();
// s_TextEditor.text = string.Empty;
}
}
}