using UnityEngine; namespace NecromancerTome { /// /// Замер фризов (жалоба 10.10: «в чертогах лагает... это были фризы»). Средний FPS из строк игры «Time: ... FPS» /// их не показывает - он за минуту. Здесь каждый кадр дольше Threshold пишется в лог: длительность, сколько /// сборок мусора прошло за этот кадр (GC поколения 0 - если растёт, фриз от сборки мусора: мод или игра много /// выделяют), режим мода (чертоги/змея/одержимость) и сколько областей мира загружено. /// Строки: «[NecromancerTome] FreezeProbe: ...». Ничего не хранит, кроме пары чисел. /// public static class FreezeProbe { public const float Threshold = 0.1f; static int _gc = -1; static float _skipUntil; public static void Init() { ModEvents.UnityUpdate.RegisterHandler(OnUnityUpdate); } static void OnUnityUpdate(ref ModEvents.SUnityUpdateData _data) { int gc = System.GC.CollectionCount(0); World world = GameManager.Instance?.World; if (world == null || world.GetPrimaryPlayer() == null) { _gc = gc; _skipUntil = Time.unscaledTime + 20f; // загрузка мира - фризы ожидаемы return; } float dt = Time.unscaledDeltaTime; int dgc = _gc < 0 ? 0 : gc - _gc; _gc = gc; if (dt < Threshold || Time.unscaledTime < _skipUntil || GameManager.Instance.IsPaused()) { return; } string mode = MindPalace.Active ? "чертоги" : SnakeMode.Active ? "змея" : Possession.Active ? "одержимость" : "тело"; int obs = GameManager.Instance.World?.m_ChunkManager?.m_ObservedEntities?.Count ?? -1; Debug.Log("[NecromancerTome] FreezeProbe: кадр " + Mathf.RoundToInt(dt * 1000f) + " мс, сборок мусора +" + dgc + ", режим " + mode + ", наблюдателей областей " + obs + ", куча " + (System.GC.GetTotalMemory(false) >> 20) + " МБ"); } } }