using System; using System.Text; using UnityEngine; using UnityEngine.UI; namespace ADOFAIRenderer.Component { public class DebugMonitorUI : MonoBehaviour { private Text _text = null!; private void Start() { // UI 레이어(5) 설정 gameObject.layer = 5; // Canvas 설정 Canvas canvas = gameObject.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 9999; // 해상도 다이내믹 스케일링 설정 (Reference: 1920x1080) CanvasScaler scaler = gameObject.AddComponent(); scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = new Vector2(1920, 1080); scaler.screenMatchMode = CanvasScaler.ScreenMatchMode.MatchWidthOrHeight; scaler.matchWidthOrHeight = 0.5f; gameObject.AddComponent(); // 배경 패널 생성 GameObject panelObj = new GameObject("BackgroundPanel"); panelObj.transform.SetParent(transform, false); panelObj.layer = 5; Image image = panelObj.AddComponent(); image.color = new Color(0.08f, 0.08f, 0.1f, 0.88f); // 약간 더 고급스러운 다크톤 아크릴 감성 RectTransform panelRect = panelObj.GetComponent(); panelRect.anchorMin = new Vector2(1, 1); panelRect.anchorMax = new Vector2(1, 1); panelRect.pivot = new Vector2(1, 1); panelRect.anchoredPosition = new Vector2(-30, -30); panelRect.sizeDelta = new Vector2(340, 250); // 텍스트 생성 GameObject textObj = new GameObject("MonitorText"); textObj.transform.SetParent(panelObj.transform, false); textObj.layer = 5; _text = textObj.AddComponent(); _text.supportRichText = true; _text.fontSize = 13; _text.lineSpacing = 1.3f; _text.alignment = TextAnchor.UpperLeft; // uGUI 특유의 텍스트 잘림 현상 원천 예방 _text.horizontalOverflow = HorizontalWrapMode.Wrap; _text.verticalOverflow = VerticalWrapMode.Overflow; Font? font = Resources.GetBuiltinResource("LegacyRuntime.ttf"); if (font == null) { font = Resources.GetBuiltinResource("Arial.ttf"); } if (font == null) { var fonts = Resources.FindObjectsOfTypeAll(); if (fonts.Length > 0) font = fonts[0]; } _text.font = font; RectTransform textRect = textObj.GetComponent(); textRect.anchorMin = Vector2.zero; textRect.anchorMax = Vector2.one; textRect.offsetMin = new Vector2(20, 20); // 좀 더 넉넉하고 아름다운 패딩 여백 textRect.offsetMax = new Vector2(-20, -20); } private void Update() { if (!_text) return; StringBuilder sb = new StringBuilder(); sb.AppendLine("ADOFAI Renderer Realtime Monitor"); sb.AppendLine(); sb.AppendLine($"• Rendered Progress: {RenderManager.FrameCount} frames"); int queueCount; lock (RenderManager.ImageQueue) { queueCount = RenderManager.ImageQueue.Count; } sb.AppendLine($"• Queued Buffers: {queueCount} / 60 frames"); if (RenderMod.IsThrottling) { sb.AppendLine("• Status: THROTTLING (Safe Mode)"); } else { sb.AppendLine("• Status: NORMAL (Encoding)"); } sb.AppendLine(); sb.AppendLine($"• Throttling Controls: {RenderMod.ThrottleCount} times"); sb.AppendLine($"• Readback Hard Failures: {RenderMod.ReadbackFailureCount} times"); sb.AppendLine($"• Render Skip-Retry: {RenderMod.SkipCount} / 60"); double memoryMb = GC.GetTotalMemory(false) / (1024.0 * 1024.0); sb.AppendLine($"• Mono Heap Memory: {memoryMb:F2} MB"); _text.text = sb.ToString(); } } }