2013-04-18 23 views
4

我正在使用以下代码来计算Unity3d 4.0中的帧速率。它应用于NGUI标签上。常量和可能不准确帧率

void Update() { 
     timeleft -= Time.deltaTime; 
     accum += Time.timeScale/Time.deltaTime; 
     ++frames; 

     // Interval ended - update GUI text and start new interval 
     if(timeleft <= 0.0) 
     { 
      // display two fractional digits (f2 format) 
      float fps = accum/frames; 
      string format = System.String.Format("{0:F2} FPS",fps); 
      FPSLabel.text = format; 
       timeleft = updateInterval; 
       accum = 0.0F; 
       frames = 0; 
      } 
    } 

这是以前的工作,或至少似乎是working.Then我是有一些问题与物理,所以我改变了固定时间步长0.005和最大时间步到0.017。是的,我知道它太低了,但我的游戏在这方面工作得很好。
现在问题是上面的FPS代码总是返回58.82。我检查了单独的设备(Android)。它只是没有预算。我认为这可能是正确的,但是当我看到分析器时,我可以清楚地看到那里的起伏。所以显然这是有点可疑的。

我做错了什么?我从某处复制了代码(必须来自脚本wiki)。有没有其他方法可以知道正确的FPS?

通过从this questions提示暗示,我已经尝试了第一个答案中的所有方法。即使下面的代码是返回一个常数58.82 FPS。它仅在Android设备中发生。在编辑器中,我可以看到fps的差异。

float fps = 1.0f/Time.deltaTime;

所以我检查了Time.deltaTime的值,它在设备中是0.017常量。这怎么可能: -/

回答

3

在我看来,fps计数器是正确的,58.82的FPS是由物理时间设置的变化引起的。物理引擎可能无法在可用的时间步(0.005,这是非常低的)完成计算,这意味着它将保持计算,直到它达到最大时间步,在你的情况下是0.017。这意味着所有的帧将需要0.017加上你可能拥有的渲染/脚本的任何其他开销。而1/0.017恰好等于58.82。

也许你可以通过其他方式解决物理学上的任何问题,而不会严重降低固定时间步长。

+0

所以我只需要增加固定的时间步?我可以保持最大时间步长为0.017吗? – noob 2013-04-18 16:41:56

+0

@创始人我认为这可能有效。你可以尝试不同的值。您也可以尝试直接在设备上进行分析,以查看物理模拟需要多少毫秒,并相应地调整固定的时间步长。 – alexFlorea 2013-04-19 06:05:36