Files
necromants-tome-7d2d-3-2/HarmonySrc/FreezeProbe.cs
T
AlexCubeandClaude Opus 5.5 197df1d307 Чертоги: фризы - область у тела сжата; замер фризов в лог
В чертогах игра держала две полные области мира (у чертогов и у тела).
Тело теперь сжато до 3 участков, как у змеи и одержимого; при выходе
возвращается. FreezeProbe пишет каждый кадр дольше 100 мс: длительность,
сборки мусора за кадр, режим, число наблюдателей областей, куча.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 13:52:15 +03:00

47 lines
2.2 KiB
C#

using UnityEngine;
namespace NecromancerTome
{
/// <summary>
/// Замер фризов (жалоба 10.10: «в чертогах лагает... это были фризы»). Средний FPS из строк игры «Time: ... FPS»
/// их не показывает - он за минуту. Здесь каждый кадр дольше Threshold пишется в лог: длительность, сколько
/// сборок мусора прошло за этот кадр (GC поколения 0 - если растёт, фриз от сборки мусора: мод или игра много
/// выделяют), режим мода (чертоги/змея/одержимость) и сколько областей мира загружено.
/// Строки: «[NecromancerTome] FreezeProbe: ...». Ничего не хранит, кроме пары чисел.
/// </summary>
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) + " МБ");
}
}
}