Unity移动设备30fps锁定

5

自从昨天起,我的Unity游戏在安卓设备上锁定在30fps。之前是150fps。我已经禁用了垂直同步。这是我昨天添加的唯一脚本:

public static class SaveLoadProgress {

public static void Save()
{
    LevelManager levelManager = GameObject.Find ("GameManager").GetComponent<LevelManager> ();
    BinaryFormatter bf = new BinaryFormatter();
    FileStream file = File.Create (Application.persistentDataPath + "/savedProgress.1912");
    bf.Serialize(file, levelManager.levelReached);
    file.Close();
}

public static void Load() 
{
    LevelManager levelManager = GameObject.Find ("GameManager").GetComponent<LevelManager> ();
    if(File.Exists(Application.persistentDataPath + "/savedProgress.1912")) 
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/savedProgress.1912", FileMode.Open);
        levelManager.levelReached = (int)bf.Deserialize(file);
        file.Close();
    }
}
}

我不认为这可能是问题所在。 我把这个添加到GameManager中:
    void Awake()
{
    Application.targetFrameRate = -1;
    QualitySettings.vSyncCount = 0;
}

分析器显示如下:

https://i.gyazo.com/33a4f6d2f87899568472b1f890bca1ec.png

我该怎么做才能将其从30fps解锁?

不错的问题。恭喜。 - statosdotcom
5个回答

15
默认情况下,Unity会根据当前平台锁定fps的特定值。文档显示Android的默认值是30,这是大多数Android设备使用的值。另外文档中还提到:

默认的targetFrameRate是一个特殊值-1,表示游戏应该以平台的默认帧率进行渲染。

正如文章中所说,对于移动设备而言,这个默认值是30。
此外,在编辑器中运行游戏时,可以拥有尽可能多的FPS,可能是150或更多,但是拥有超过60帧每秒其实是很糟糕的做法(因为iPhone和某些Android设备的最大值就是60)。如果你拥有超过60 fps,你实际上看不到差别,因为设备的显示器实际上无法呈现超过60帧每秒,而且会消耗电池和CPU资源,所有这些额外的计算(为了获得60+ fps)都是无用的,甚至是有害的。
要将FPS设置为高于30,您可以像在代码中一样将其设置为60:
Application.targetFrameRate = 60;

此外,垂直同步在移动设备上大多无法正常工作,因此您不需要担心这个问题。


谢谢,我以为我已经做了,但现在它可以工作了。奇怪的是,几天前fps在移动设备上也只有150。 - J.K. Harthoorn

2

这不算是回答,只是对@vmchar的回答进行了扩展:

我不同意VSync在移动设备上无法工作。我们将Application.targetFrameRate设置为60,但仍然存在CPU损坏GPU的问题。设置VSync可以强制等待。帧速率从https://imgur.com/a/lE0LedF提高到https://imgur.com/a/EPq6q7T

Unity不建议同时使用两者:

Application.targetFrameRate是软件VSync,用于限制模拟速度而没有硬件VSync(例如在服务器上)。不应该将targetFrameRate与vSyncCount一起使用,因为CPU帧可能会漂移,并导致渲染命令被延迟而错过下一个垂直同步。

但在编辑器中,VSync设置不受尊重,因此您仍然可能会遇到问题。

完整线程:https://forum.unity.com/threads/gfx-presentframe-taking-4x-as-long-but-only-for-intermittent-periods.538254


1

如果您安装了适应性性能三星Android包,则会覆盖对Application.targetFrameRate的任何更改。

如果您想保留该软件包,则需要调整设置。要访问设置:编辑>项目设置>适应性性能>三星(Android)

取消选中所有内容后,适应性性能设置就会被移除。您可以从那里重新启用所需的设置。


1
晚到派对,但这个标志几乎没有被提及。
optimizedFramePacing:Unity文档链接 关闭此标志对移动平台,尤其是Android,有显著影响。
在“项目设置”>“播放器”>“分辨率和演示”中可用。
更多细节: 在某些Android设备上,即使将“targetFrameRate”设置为30,实际帧率仍然锁定在20。 根据文档,此标志自2019.4版本以来存在,并且大多数最新版本都有。
希望对某人有所帮助!干杯!

1

正如其他回答中所述,如果Unity将您的帧速率锁定为30或其他类似值。我的帧速率被锁定在30 FPS,只需在Start()方法中添加Application.targetFrameRate = 60; ,或者在应用程序的生命周期内需要设置帧速率的任何时候添加。

void Start()
{
    Application.targetFrameRate = 60;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接