【发布时间】:2020-08-20 04:25:43
【问题描述】:
我正在使用 Unity 和 Vuforia 扩展制作一个带有增强现实的项目。我是 C# 新手,但我一直在寻找类似于 ARToolKit 的 getFrame() 的方法,但我真的什么都没找到。
我的问题是:
- 是否有必要计算我的场景运行的帧速率?
- 我应该使用哪个场景对象来跟踪帧率?
【问题讨论】:
标签: c# unity3d frame-rate
我正在使用 Unity 和 Vuforia 扩展制作一个带有增强现实的项目。我是 C# 新手,但我一直在寻找类似于 ARToolKit 的 getFrame() 的方法,但我真的什么都没找到。
我的问题是:
【问题讨论】:
标签: c# unity3d frame-rate
就这么简单:
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
}
编辑
如果您希望在应用减速/时间改变效果时保持一致,您甚至可以将帧时间乘以 Time.timeScale。
【讨论】:
这里的答案都没有考虑到 timescale 可以在 Unity 中修改的事实,如果是,上述所有方法都是不正确的。这是因为Time.Delta时间受timescale影响。
因此,您需要使用Time.unscaledDeltaTime:
int fps = 0;
void Update () {
fps = (int)(1f / Time.unscaledDeltaTime);
}
【讨论】:
由于帧速率可以不断变化,它会在给定的一秒内多次变化。我使用以下推荐的方法来获取当前帧速率。只需将其放入新脚本并将其添加到场景中的新空游戏对象即可。
float deltaTime = 0f;
void Update() {
deltaTime += (Time.deltaTime - deltaTime) * .1f;
}
来源,含显示方式:http://wiki.unity3d.com/index.php?title=FramesPerSecond
【讨论】:
您应该查看Time.smoothDeltaTime。这将返回一个平滑的 Time.deltaTime 值,您可以使用该值,而不必使用其他答案中提到的一种技术自行对其进行平滑处理。
【讨论】: