В прошлых постах я как-то показала как выглядит мой модуль 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




