版本: Unity 6 (6000.0)
语言English
  • C#

ProfilerRecorder.LastValue

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们确实会阅读用户提出的每个建议更改,并在适用情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

public long LastValue;

描述

获取 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 方法调用后才能读取且不为零。