限时福利领取


在Unity开发过程中,帧率(FPS)就像游戏的脉搏,直接反应运行流畅度。但很多新手常遇到这样的困境:明明感觉游戏卡顿,却找不到具体原因。今天我们就用一个轻量级FPS显示插件来解决这个问题。

游戏性能监控

一、为什么需要FPS监控

没有FPS显示时,调试就像蒙眼走路:

  • 卡顿现象转瞬即逝,难以捕捉具体场景
  • 性能优化没有数据支撑,全凭感觉调整
  • 不同设备表现差异大,缺少统一衡量标准

二、三种实现方案对比

常见的FPS显示实现方式各有特点:

  1. OnGUI
  2. 优点:实现简单,几行代码就能搞定
  3. 缺点:每帧都会产生GC Alloc,移动端慎用

  4. UGUI

  5. 优点:支持富文本样式,易扩展
  6. 缺点:Canvas重建开销较大

  7. TextMeshPro

  8. 优点:渲染效率最高
  9. 缺点:需要导入额外资源包

性能对比图

三、最优实现方案

推荐使用UGUI+优化策略的组合方案,下面是核心代码:

using UnityEngine;
using UnityEngine.UI;

public class FPSDisplay : MonoBehaviour
{
    [SerializeField] Text fpsText;
    [SerializeField] float updateInterval = 0.5f;

    private float accum = 0f;
    private int frames = 0;
    private float timeLeft;

    void Start()
    {
        // 屏幕右上角显示
        fpsText.rectTransform.anchorMin = new Vector2(1, 1);
        fpsText.rectTransform.anchorMax = new Vector2(1, 1);
        fpsText.rectTransform.pivot = new Vector2(1, 1);

        timeLeft = updateInterval;
    }

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

        if (timeLeft <= 0f)
        {
            // 使用StringBuilder避免GC
            fpsText.text = System.Text.StringBuilder.AppendFormat(
                "FPS: {0:F2}", accum / frames).ToString();

            timeLeft = updateInterval;
            accum = 0f;
            frames = 0;
        }
    }
}

四、性能优化要点

  1. 更新频率控制
  2. 不要每帧更新显示,建议0.5秒更新一次
  3. 使用Time.deltaTime计算滑动平均更准确

  4. 内存优化

  5. 避免在Update中频繁创建字符串
  6. 使用StringBuilder或预分配字符串

  7. 渲染优化

  8. 将FPS文本放在单独的Canvas中
  9. 关闭Raycast Target减少交互开销

五、常见问题排查

  • 移动端帧率异常低:检查是否开启了垂直同步(VSync)
  • 文本显示闪烁:确保Canvas的Pixel Perfect选项关闭
  • 编辑器正常但打包后不显示:检查组件是否被Strip

六、进阶扩展建议

想要更专业的性能监控可以:

  1. 添加帧时间直方图
  2. 记录最低/最高/平均FPS
  3. 集成内存占用显示

我已经把完整项目上传到GitHub示例仓库,包含更多高级功能实现。

进阶功能展示

这个小工具虽然简单,但确实是项目优化的好帮手。建议每个项目都集成基础版的FPS显示,关键时刻能省去很多调试时间。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐