Infinity World (Дневники разработчицы): post #124 — TG.ME

Всем привет! 👋

В прошлых постах я как-то показала как выглядит мой модуль Profiler для моего аллокатора. Да и в комментариях советовали написать свой модуль под свои запросы. Это был отличный совет, потому что трекать по конкретным метрикам, описанным заранее, нааамного удобнее!
🥹

Вот тут у Unity есть документация, как сделать такие красивости самостоятельно, но как обычно это бывает, там нет всей информации.

Я не нашла как трекать все свои метрики, в особенности, как трекать большие объемы данных (массивы данных) и как их потом получить в самом модуле для отрисовки.
😔

Чтобы записать свои данные, которые потом можно будет получать покадрово, надо воспользоваться счетчиками ProfilerCounter:

 public static readonly ProfilerCounter<long> TotalAllocatedMemoryCounter = new(ProfilerCategory,
TotalAllocatedMemoryName, ProfilerMarkerDataUnit.Bytes);
...
// и вот так записывать значение каждый кадр
TotalAllocatedMemoryCounter.Sample(frameData.TotalAllocatedMemory);


Для больших объемов, когда необходимо засэмплить целый буфер, можно воспользоваться другим API - Profiler.EmitFrameMetaData. Туда можно передать как обычный массив/список, так и нативный массив. Разве что нативный NativeArray необходимо создавать с аллокатором Temp. Видимо внутри они просто копируют все переданные данные в свой стрим, откуда потом читают.

А вот чтобы прочитать и отрисовать потом данные по какому-то кадру, стоит воспользоваться ProfilerDriver.GetRawFrameDataView.
В этот метод передается номер кадра (в Profiler его можно получить через ProfilerWindow.SelectedFrameIndexChanged) и индекс потока (0 для main thread).

Полученный объект RawFrameDataView позволяет уже прочитать данные по тем же самым айдишникам, что были указаны в счетчиках раннее. В целом удобно.
😛

Спасибо за внимание!
🥰

#unity
1🔥17❤12🥰5
October 6, 2025 1.3K 6