我正在使用Unity和Vuforia扩展创建一个增强现实项目。我是C#的新手,但我一直在寻找一种类似于ARToolKit getFrame()
的方法,我真的没找到任何东西。
我的问题是:
答案 0 :(得分:2)
你会想要一个跟踪时间的计时器,以及更新屏幕需要多长时间,以及从一秒钟内绘制多少帧的推断。
我对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。
答案 1 :(得分:1)
这很简单:
public float avgFrameRate;
public void Update()
{
avgFrameRate = Time.frameCount / Time.time;
}
将此代码放在任何MonoBehaviour
中,并将其附加到场景层次结构中的任何GameObject
。
请注意:这只会为您提供平均帧率。对于更新的帧速率,其他答案已经解决了实现这一目标的有效方法。
答案 2 :(得分:1)
由于帧速率可以不断变化,因此在给定的秒数内它会发生很多次变化。我使用了以下推荐的方法来获得当前帧速率。只需将其放入新脚本中,然后将其添加到场景中新的空游戏对象中即可。
float deltaTime = 0f;
void Update() {
deltaTime += (Time.deltaTime - deltaTime) * .1f;
}
来源,包括显示方式:http://wiki.unity3d.com/index.php?title=FramesPerSecond
答案 3 :(得分:1)
你应该看看Time.smoothDeltaTime。这将返回一个平滑的Time.deltaTime值,您可以使用该值,而不必使用其他答案中提到的技术之一自行平滑它。
答案 4 :(得分:0)
这里没有答案考虑timescale
可以在Unity中进行修改的事实,如果可以修改,则上述所有方法都不正确。这是因为Time.Delta
的时间受timescale
的影响。
因此,您需要使用Time.unscaledDeltaTime
:
int fps = 0;
void Update () {
fps = (int)(1f / Time.unscaledDeltaTime);
}