namespace SRDebugger.UI.Controls
{
using System;
using System.Collections;
using SRF;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_5_5_OR_NEWER
using UnityEngine.Profiling;
#endif
public class ProfilerMemoryBlock : SRMonoBehaviourEx
{
private float _lastRefresh;
[RequiredField] public Text CurrentUsedText;
[RequiredField] public Slider Slider;
[RequiredField] public Text TotalAllocatedText;
protected override void OnEnable()
{
base.OnEnable();
TriggerRefresh();
}
protected override void Update()
{
base.Update();
if (SRDebug.Instance.IsDebugPanelVisible && (Time.realtimeSinceStartup - _lastRefresh > 1f))
{
TriggerRefresh();
_lastRefresh = Time.realtimeSinceStartup;
}
}
public void TriggerRefresh()
{
long max;
long current;
#if UNITY_5_6_OR_NEWER
max = Profiler.GetTotalReservedMemoryLong();
current = Profiler.GetTotalAllocatedMemoryLong();
#else
max = Profiler.GetTotalReservedMemory();
current = Profiler.GetTotalAllocatedMemory();
#endif
var maxMb = (max >> 10);
maxMb /= 1024; // On new line to fix il2cpp
var currentMb = (current >> 10);
currentMb /= 1024;
Slider.maxValue = maxMb;
Slider.value = currentMb;
TotalAllocatedText.text = "Reserved: {0}MB".Fmt(maxMb);
CurrentUsedText.text = "{0}MB".Fmt(currentMb);
}
public void TriggerCleanup()
{
StartCoroutine(CleanUp());
}
private IEnumerator CleanUp()
{
GC.Collect();
yield return Resources.UnloadUnusedAssets();
GC.Collect();
TriggerRefresh();
}
}
}