如何在 Unity3D 场景中显示帧率(FPS)

2023-10-22 11:27:59 浏览数 (2)

本文介绍如何在 Unity3D 场景中显示帧率。

插入 UI:Text

做 FPS 帧率显示需要用到 UI 对象 Text,因此你需要有一个 Canvas。关于在 Unity3D 中插入 UI 对象的方法可见我的另一篇博客:

  • Unity3D 入门:如何为游戏添加 UI - walterlv

当添加了 Canvas 后,再在 Canvas 里添加 Text:

设置文本的属性和布局

选中文本对象,在 Inspector 窗格中有很多需要设置的属性。如下图所示。

锚点对齐

上图中,我把点击对齐格子的弹出框放到了场景空间中(截图而已,实际不能放),不然会遮挡窗口中的其他属性。

这里在水平和垂直方向上都分别可以设置 4 种对齐方式:

  • 左/上 对齐
  • 居中对齐
  • 右/下 对齐
  • 拉伸对齐

默认是水平垂直居中,于是 UI 对象会以场景的中心为参考点布局。如果你强行把文本对象拉到左上角,那么你会失去分辨率自适应的特性。

由于本文期望 FPS 显示到左上角,所以我把锚点设置成左上角。

相对位置,大小

接着,使用鼠标拖拽文本到合适的位置。也可以直接在 Inspector 窗口中设置 PosX 和 PosY 属性,这样更精确。

也许你注意到还有一个 PosZ 属性可以设置。如果你在 2D 视图中,那么你会发现设置这个属性是“无效”的,但只要切回 3D 视图,你就能发现还是有深度变化的。不过,在设置 Canvas 的 Render Mode 属性之前(保持默认值),这个设置依然还是没有意义,因为默认情况下 UI 在最终显示的时候是始终保持 2D 视图的。

可以拖拉鼠标调整文本框的大小,也可以设置 Width 和 Height 属性。

设置文本的文字内容、字体大小和颜色

在下面的 Text 组件里面,你还可以设置通常本文应该有的属性,调整到你觉得合适的值就好。

添加帧率计算脚本

接下来我们开始添加帧率计算脚本。

创建脚本

在 Inspector 窗口中添加 AddComponent 添加组件,选择新脚本,取个名字。

设计脚本属性

1 2 3 4 5 6 7 8 9 10 11

using UnityEngine; using UnityEngine.UI; public class FpsUpdater : MonoBehaviour { public Text fpsText; void Update() { } }

我们在脚本中公开一个属性 fpsText,用来在 Inspector 窗口中制定要更新的文本 UI。

然后,将文本对象拖到脚本的 Fps Text 属性上,这样我们就可以在脚本中直接使用 fpsText 字段拿到要更新文本的 Text 对象了。

当然,直接用 gameObject 也是可以的,不过需要自己再做类型转换。

编写代码

最简单的

最简单的获取 FPS 的方式是直接用 1 除以当前帧所经历的时间。

1 2 3 4 5

void Update() { var fps = 1.0f / Time.deltaTime; fpsText.text = $"FPS: {fps}"; }

然而当你实际使用的时候你就会觉得——嗯……眼睛会瞎的。

你也有可能发现文字一时出现一时消失,那可能是因为你文本框的宽度设小了。于是当小数点后位数多了一些之后,显示不下去,文字就会消失。

至少,取个整还是需要的吧,谁愿意看小数帧数呢?

1 2

var fps = 1.0f / Time.deltaTime; fpsText.text = $"FPS: {Mathf.Ceil(fps)}";

更稳定的

加了取整还是变化很快,看不清。那么可以如何更稳定呢?

可以考虑累加多帧再一次性更新。比如这里 60 帧更新一次:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

using UnityEngine; using UnityEngine.UI; public class FpsUpdater : MonoBehaviour { public Text fpsText; private int count; private float deltaTime; void Update() { count ; deltaTime = Time.deltaTime; if (count % 60 == 0) { count = 1; var fps = 60f/deltaTime; deltaTime = 0; fpsText.text = $"FPS: {Mathf.Ceil(fps)}"; } } }

或者考虑 0.5 秒更新一次:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

public Text fpsText; private int count; private float deltaTime; void Update() { count ; deltaTime = Time.deltaTime; if (deltaTime >= 0.5f) { var fps = count/deltaTime; count = 0; deltaTime = 0; fpsText.text = $"FPS: {Mathf.Ceil(fps)}"; } }

更多脚本

更多 FPS 帧数显示的脚本,可以从本文末尾的参考资料处找到。有很多不同需求的(比如帧率过低飘红的设定,比如要精确)。

参考资料

  • how to see fps? (frames per second) - Unity Answers
  • How do I find the frames per second of my game? - Unity Answers
  • FramesPerSecond - Unify Community Wiki
  • Accurate Frames Per Second Count - Unity Answers

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/unity-show-fps.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。

0 人点赞