获取 ProfilerRecorder 收集的最后一个值。
用于获取在上一帧结束时捕获的探查器计数器值或标记时间。
CurrentValue 提供的即时值在帧结束时可能不是计数器的最终值。例如,渲染可能发生在逻辑完成计算帧之后。因此,在帧完全渲染之前,无法获取绘制调用的最终值。在这种情况下,您可以使用 LastValue 属性快速访问上一帧中的最终指标值。等效调用为 GetSample(Count - 1).Value
。
注意
此属性要求样本存储不为零。在创建 ProfilerRecorder 时,传递大于 0 的容量值。
using Unity.Profiling; using UnityEngine;
public class ExampleScript : MonoBehaviour { ProfilerRecorder mainThreadTimeRecorder;
static double GetRecorderFrameAverage(ProfilerRecorder recorder) { var samplesCount = recorder.Capacity; if (samplesCount == 0) return 0;
double r = 0; unsafe { var samples = stackalloc ProfilerRecorderSample[samplesCount]; recorder.CopyTo(samples, samplesCount); for (var i = 0; i < samplesCount; ++i) r += samples[i].Value; r /= samplesCount; }
return r; }
void OnEnable() { mainThreadTimeRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "Main Thread", 15); }
void OnDisable() { mainThreadTimeRecorder.Dispose(); }
void Update() { Debug.Log($"Frame Time: {GetRecorderFrameAverage(mainThreadTimeRecorder) * (1e-6f):F1} ms"); } }
使用 LastValue 检索使用 ProfilerMarker.Auto 标记的代码的时间。
using UnityEngine; using Unity.Profiling;
public class Example { static readonly ProfilerMarker k_MyMarker = new ProfilerMarker(ProfilerCategory.Scripts, "MyMarker");
public static void TimeSynchronousMethodWithMarkers() { using (var recorder = ProfilerRecorder.StartNew(ProfilerCategory.Scripts, "MyMarker")) { using (k_MyMarker.Auto()) { // ... }
recorder.Stop(); Debug.Log("MyMarker total time, ns: " + recorder.LastValue); } } }
LastValue 仅在帧更改后或 Stop 方法调用后才能读取且不为零。