【问题标题】:Calculating the frame-rate in a Unity scene计算 Unity 场景中的帧速率
【发布时间】:2020-08-20 04:25:43
【问题描述】:

我正在使用 Unity 和 Vuforia 扩展制作一个带有增强现实的项目。我是 C# 新手,但我一直在寻找类似于 ARToolKit 的 getFrame() 的方法,但我真的什么都没找到。

我的问题是:

  1. 是否有必要计算我的场景运行的帧速率?
  2. 我应该使用哪个场景对象来跟踪帧率?

【问题讨论】:

    标签: c# unity3d frame-rate


    【解决方案1】:

    就这么简单:

    public float avgFrameRate;
    
    public void Update()
    {
        avgFrameRate = Time.frameCount / Time.time;
    }
    

    将此代码放入任何MonoBehaviour 并将其附加到场景层次结构中的任何GameObject

    请注意:这只会给你一个平均帧率。对于更当前的帧速率,其他答案已经解决了实现这一目标的有效方法。

    【讨论】:

      【解决方案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。

      【讨论】:

        【解决方案3】:

        这里的答案都没有考虑到 timescale 可以在 Unity 中修改的事实,如果是,上述所有方法都是不正确的。这是因为Time.Delta时间受timescale影响。

        因此,您需要使用Time.unscaledDeltaTime

        int fps = 0;
        void Update () {
            fps = (int)(1f / Time.unscaledDeltaTime);
        }
        

        【讨论】:

          【解决方案4】:

          由于帧速率可以不断变化,它会在给定的一秒内多次变化。我使用以下推荐的方法来获取当前帧速率。只需将其放入新脚本并将其添加到场景中的新空游戏对象即可。

          float deltaTime = 0f;
          
          void Update() {
          
              deltaTime += (Time.deltaTime - deltaTime) * .1f;
          
          }
          

          来源,含显示方式:http://wiki.unity3d.com/index.php?title=FramesPerSecond

          【讨论】:

            【解决方案5】:

            您应该查看Time.smoothDeltaTime。这将返回一个平滑的 Time.deltaTime 值,您可以使用该值,而不必使用其他答案中提到的一种技术自行对其进行平滑处理。

            【讨论】:

              猜你喜欢
              • 2022-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-07
              • 1970-01-01
              相关资源
              最近更新 更多