计算 Unity 场景中的帧率
Calculating the frame-rate in a Unity scene
我正在使用 Unity 和 Vuforia 扩展制作一个带有增强现实的项目。我是 C# 的新手,但我一直在寻找类似于 ARToolKit 的方法 getFrame()
,但我真的没有找到任何东西。
我的问题是:
- 我是否有必要计算场景运行的帧率?
- 我应该使用哪个场景对象来跟踪帧率?
就这么简单:
public float avgFrameRate;
public void Update()
{
avgFrameRate = Time.frameCount / Time.time;
}
将此代码放在任何 MonoBehaviour
中并将其附加到场景层次结构中的任何 GameObject
。
请注意:这只会为您提供平均帧速率。对于更新的帧速率,其他答案已经解决了实现该帧速率的有效方法。
您需要类似计时器的东西来跟踪时间和更新屏幕所花费的时间,并据此推断出每秒绘制了多少帧。
我对 Unity 相当生疏,但我相信像 1/Time.deltaTime
这样的东西应该可以满足您的需求。
所以你会有这样的东西
public void Update()
{
framerateThisFrame = 1/Time.deltaTime;
}
接下来您必须决定更改显示的 FPS 的频率,因为 framerateThisFrame
在每一帧中都会发生很大变化。例如,您可能希望每两秒更改一次。
编辑
您可能想要进行的一项改进是存储过去的 n 帧,并使用平均值计算 FPS,然后显示它。所以你最终可能会得到这样的结果:
public int Granularity = 5; // how many frames to wait until you re-calculate the FPS
List<double> times;
int Counter = 5;
public void Start ()
{
times = new List<double>();
}
public void Update ()
{
if (counter <= 0)
{
CalcFPS ();
counter = Granularity;
}
times.Add (Time.deltaTime);
counter--;
}
public void CalcFPS ()
{
double sum = 0;
foreach (double F in times)
{
sum += F;
}
double average = sum / times.Count;
double fps = 1/average;
// update a GUIText or something
}
编辑
如果您想在应用 slow-down/time 改变效果时保持一致,您甚至可以将帧时间乘以 Time.timeScale。
由于帧率可以不断变化,它会在给定的一秒钟内改变很多次。我使用了以下推荐的方法来获取当前帧率。只需将其放入新脚本中,然后将其添加到场景中新的空游戏对象即可。
float deltaTime = 0f;
void Update() {
deltaTime += (Time.deltaTime - deltaTime) * .1f;
}
来源,包括显示方式:http://wiki.unity3d.com/index.php?title=FramesPerSecond
你应该看看 Time.smoothDeltaTime。这个 returns 一个平滑的 Time.deltaTime 值,您可以使用它,而不必使用其他答案中提到的技术之一自行平滑它。
None 这里的答案考虑了 timescale
可以在 Unity 中修改的事实,如果是,则上述所有方法都是不正确的。这是因为 Time.Delta
时间受 timescale
.
的影响
因此,您需要使用 Time.unscaledDeltaTime
:
int fps = 0;
void Update () {
fps = (int)(1f / Time.unscaledDeltaTime);
}
我正在使用 Unity 和 Vuforia 扩展制作一个带有增强现实的项目。我是 C# 的新手,但我一直在寻找类似于 ARToolKit 的方法 getFrame()
,但我真的没有找到任何东西。
我的问题是:
- 我是否有必要计算场景运行的帧率?
- 我应该使用哪个场景对象来跟踪帧率?
就这么简单:
public float avgFrameRate;
public void Update()
{
avgFrameRate = Time.frameCount / Time.time;
}
将此代码放在任何 MonoBehaviour
中并将其附加到场景层次结构中的任何 GameObject
。
请注意:这只会为您提供平均帧速率。对于更新的帧速率,其他答案已经解决了实现该帧速率的有效方法。
您需要类似计时器的东西来跟踪时间和更新屏幕所花费的时间,并据此推断出每秒绘制了多少帧。
我对 Unity 相当生疏,但我相信像 1/Time.deltaTime
这样的东西应该可以满足您的需求。
所以你会有这样的东西
public void Update()
{
framerateThisFrame = 1/Time.deltaTime;
}
接下来您必须决定更改显示的 FPS 的频率,因为 framerateThisFrame
在每一帧中都会发生很大变化。例如,您可能希望每两秒更改一次。
编辑
您可能想要进行的一项改进是存储过去的 n 帧,并使用平均值计算 FPS,然后显示它。所以你最终可能会得到这样的结果:
public int Granularity = 5; // how many frames to wait until you re-calculate the FPS
List<double> times;
int Counter = 5;
public void Start ()
{
times = new List<double>();
}
public void Update ()
{
if (counter <= 0)
{
CalcFPS ();
counter = Granularity;
}
times.Add (Time.deltaTime);
counter--;
}
public void CalcFPS ()
{
double sum = 0;
foreach (double F in times)
{
sum += F;
}
double average = sum / times.Count;
double fps = 1/average;
// update a GUIText or something
}
编辑
如果您想在应用 slow-down/time 改变效果时保持一致,您甚至可以将帧时间乘以 Time.timeScale。
由于帧率可以不断变化,它会在给定的一秒钟内改变很多次。我使用了以下推荐的方法来获取当前帧率。只需将其放入新脚本中,然后将其添加到场景中新的空游戏对象即可。
float deltaTime = 0f;
void Update() {
deltaTime += (Time.deltaTime - deltaTime) * .1f;
}
来源,包括显示方式:http://wiki.unity3d.com/index.php?title=FramesPerSecond
你应该看看 Time.smoothDeltaTime。这个 returns 一个平滑的 Time.deltaTime 值,您可以使用它,而不必使用其他答案中提到的技术之一自行平滑它。
None 这里的答案考虑了 timescale
可以在 Unity 中修改的事实,如果是,则上述所有方法都是不正确的。这是因为 Time.Delta
时间受 timescale
.
因此,您需要使用 Time.unscaledDeltaTime
:
int fps = 0;
void Update () {
fps = (int)(1f / Time.unscaledDeltaTime);
}