Unity帧率设置以及运行时显示帧率

Unity帧率设置以及运行时显示帧率

    • 设置帧率
    • 测试与显示帧率

设置帧率

在Unity3d 中可以通过代码设置来限定游戏帧率。

Application.targetFrameRate = -1;

设置为**-1**表示不限定帧率,一般情况在手机游戏中我们限定帧率为30就OK了。

Application.targetFrameRate = 30;

但是把这个代码添加到工程之后,在Unity中运行起来发现并没有起作用,于是到官网查看资料,官网的解释是:

指示游戏尝试以指定的帧率渲染。
默认的targetFrameRate是一个特殊值-1,表示游戏应以平台的默认帧率渲染。此默认速率取决于平台:

  • 独立平台上,默认帧率是可实现的最大帧率。
  • 移动平台上,由于需要节省电池电量,默认帧率小于可实现的最大帧率。移动平台上的默认帧率通常为每秒30帧。
  • 所有移动平台可实现的最大帧率都有固定上限,这等于屏幕的刷新率(60Hz=60fps,40Hz=40fps,…)。Screen.currentResolution包含屏幕刷新率。
  • 此外,所有移动平台都只能在VBlank上显示帧。因此,应将targetFrameRate设置为-1,或是等于屏幕刷新率的值,或是刷新率除以一个整数。否则,生成的帧率始终小于targetFrameRate。注意:如果将targetFrameRate设置为刷新率除以一个整数,则整数除法得到的有效fps与将QualitySettings.vSyncCount设置为相同整数值时相同。
  • iOS会忽略QualitySettings.vSyncCount设置。相反,设备会在帧准备就绪之后的第一个可能VBlank上显示帧,应用程序会实现 targetFrameRate
  • WebGL上,默认值允许浏览器选择帧率来匹配其渲染循环时序,这通常会产生最平滑的效果。只有当您想要限制WebGL上的CPU使用率时,才建议使用非默认值。
  • 使用VR时,Unity将使用SDK指定的目标帧率并忽略游戏指定的值。

设置targetFrameRate不保证会实现帧率。由于平台规格不同,帧率可能会出现波动,或者由于设备速度太慢,游戏可能无法达到帧率。
此外,如果设置了QualitySettings.vSyncCount属性,将忽略targetFrameRate,而游戏将使用vSyncCount和平台的默认渲染率来确定目标帧率。例如,如果平台的默认渲染速率为每秒60帧且vSyncCount设置为2,则游戏将以每秒30帧为目标。
在编辑器中,targetFrameRate仅影响Game视图。不会影响其他编辑器窗口。

大致总结:

  • Application.targetFrameRate是用来让游戏以指定的帧率运行,如果设置为-1就让游戏以最快的速度运行。
  • 但是这个设定会垂直同步影响。
  • 如果设置了垂直同步,那么就会抛弃这个设定 而根据屏幕硬件的刷新速度来运行。
  • 如果设置了垂直同步为1,那么就是60帧。
  • 如果设置了为2,那么就是30帧。

测试与显示帧率

点击菜单Editor->ProjectSetting->QualitySettings来打开渲染质量设置面板。
Unity帧率设置以及运行时显示帧率_第1张图片
1、首先关掉垂直同步,如上图。
设置帧率为100。

void Awake()
{
    Application.targetFrameRate = 100;
}

然后运行后的帧率是100。
Unity帧率设置以及运行时显示帧率_第2张图片
2、设置垂直同步为1
Unity帧率设置以及运行时显示帧率_第3张图片
可以看到帧率为60帧左右跳动,完全无视了代码中的设定。
3、设定垂直同步为2
Unity帧率设置以及运行时显示帧率_第4张图片
可以看到帧率在30帧左右跳动。
在游戏中显示帧率代码:

using UnityEngine;

public class FPS : MonoBehaviour
{
    /// 
    /// 上一次更新帧率的时间
    /// 
    private float m_lastUpdateShowTime = 0f;
    /// 
    /// 更新显示帧率的时间间隔
    /// 
    private readonly float m_updateTime = 0.05f;
    /// 
    /// 帧数
    /// 
    private int m_frames = 0;
    /// 
    /// 帧间间隔
    /// 
    private float m_frameDeltaTime = 0;
    private float m_FPS = 0;
    private Rect m_fps, m_dtime;
    private GUIStyle m_style = new GUIStyle();

    void Awake()
    {
        Application.targetFrameRate = 100;
    }

    void Start()
    {
        m_lastUpdateShowTime = Time.realtimeSinceStartup;
        m_fps = new Rect(0, 0, 100, 100);
        m_dtime = new Rect(0, 100, 100, 100);
        m_style.fontSize = 100;
        m_style.normal.textColor = Color.red;
    }

    void Update()
    {
        m_frames++;
        if (Time.realtimeSinceStartup - m_lastUpdateShowTime >= m_updateTime)
        {
            m_FPS = m_frames / (Time.realtimeSinceStartup - m_lastUpdateShowTime);
            m_frameDeltaTime = (Time.realtimeSinceStartup - m_lastUpdateShowTime) / m_frames;
            m_frames = 0;
            m_lastUpdateShowTime = Time.realtimeSinceStartup;
            //Debug.Log("FPS: " + m_FPS + ",间隔: " + m_FrameDeltaTime);
        }
    }

    void OnGUI()
    {
        GUI.Label(m_fps, "FPS: " + m_FPS, m_style);
        GUI.Label(m_dtime, "间隔: " + m_frameDeltaTime, m_style);
    }
}

你可能感兴趣的:(功能,基础,unity,游戏开发)