[英]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
}
编辑
如果您希望在应用减速/时间更改效果时保持一致,您甚至可以将帧时间乘以 Time.timeScale。
由于帧速率可以不断变化,因此在给定的一秒内它会改变很多次。 我使用以下推荐的方法来获取当前的帧速率。 只需将其放入新脚本中,然后将其添加到场景中的新空游戏对象中即可。
float deltaTime = 0f;
void Update() {
deltaTime += (Time.deltaTime - deltaTime) * .1f;
}
来源,包括显示方式: http : //wiki.unity3d.com/index.php?title=FramesPerSecond
你应该看看Time.smoothDeltaTime 。 这将返回一个平滑的 Time.deltaTime 值,您可以使用该值,而不必使用其他答案中提到的技术之一自行平滑它。
这里的答案都没有考虑到可以在 Unity 中修改timescale
的事实,如果是,则上述所有方法都是不正确的。 这是因为Time.Delta
时间受timescale
影响。
因此,您需要使用Time.unscaledDeltaTime
:
int fps = 0;
void Update () {
fps = (int)(1f / Time.unscaledDeltaTime);
}
IEnumerator FramesPerSecond()
{
while (true)
{
yield return new WaitForSeconds(1);
Debug.LogFormat("Fps {0}", Time.frameCount/Time.time);
}
}
private void Start()
{
StartCoroutine(FramesPerSecond());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.