我的协程在 Unity android 应用程序上 运行 慢

My coroutine is running slower on Unity android aplication

我正在制作 Cookie Clicker 副本。

我正在使用 yield return new WaitForSeconds (0.1f) 每秒将 cookie 添加到 cookie 计数器,我希望它们以快速方式添加,而不是每秒添加一次。

问题是,当我 运行 它在我的计算机上时,它运行得很好,但是当我 运行 它在我的 android 上时,它慢慢地将 cookie 添加到计数器.

据我所知,我认为这与FPS有关。我尝试在 WaitForSeconds 中使用 (Time.deltaTime * 0.1f),但它在 android 中仍然运行缓慢。也尝试使用 Invoke() 方法,但效果也很慢。

(我在 Update 方法中有 StartCoroutine。) (当我把1秒而不是0.1f时,效果很好,但从外观上看不太好看。)

 IEnumerator Rps()
 {
     Stats.CookiesTotal = Stats.CookiesTotal + Stats.cookiesPerSecond;
     yield return new WaitForSeconds(Time.deltaTime * 0.1f);
     yield return null;
 }
 private void Update()
 {
     StartCoroutine(Rps());
     openSlot(price1text, price1, slot1);
     openSlot(price2text, price2, slot2);
     openSlot(price3text, price3, slot3);
 }

您正在从 Update() 调用依赖于帧率的协程。 所以在 60 fps 的机器上,它会 运行 Rps() 60 次,而在 30 fps 的机器上,它会 运行 Rps() 30 次。因此,更快的 fps 机器将更快地生成 cookie。 另请注意,WaitForSeconds 发生在 之后 您增加了 cookie 数量,这意味着它根本没有延迟,因此实际上,此代码与:

private void Update()
{
    Stats.CookiesTotal = Stats.CookiesTotal + Stats.cookiesPerSecond;
    //...
}

正如其他人所建议的那样,在 Update() 中以这种方式使用协程并不理想。通过在 Start() 中启动协程并在协程内设置一个无限循环来增加 cookie 计数并等待 X 时间,可以实现协程常量 cookie 每 0.1 秒增加一次。您需要非常注意管理无限循环协程。 (这段代码未经测试,但应该给你大概的想法)

private IEnumerator countCookiesCoroutine;

IEnumerator Rps()
{
    while (true){
        Stats.CookiesTotal = Stats.CookiesTotal + Stats.cookiesPerSecond;
        yield return new WaitForSeconds(0.1f);
    }
}

private void Start()
{
    countCookiesCoroutine = Rps();
    StartCoroutine(countCookiesCoroutine);
}

一种更直接的方法,尤其是当您处理大量 cookie 并且精度不重要时,可能是根据物理时间步长 FixedUpdate() 增加 cookie 计数,例如:

private void FixedUpdate(){
    Stats.CookiesTotal = Stats.CookiesTotal + (Stats.cookiesPerSecond * Time.fixedDeltaTime);
}

这将使 cookie 速率的增加与物理更新和帧速率无关。我使用 FixedTime() 而不是 Update() 的原因是因为 Update() 依赖于帧率,即使使用 Time.deltaTime 更快的机器仍然会更快地收集 cookie,因为复合 cookie 的兴趣更高比在较慢的 fps 机器上计算得更频繁。

如果不希望显示小数,您可能还需要将 cookie 编号的显示包裹在 Mathf.Floor() 中。