首页 > 解决方案 > 我的协程在 Unity android 应用程序上运行速度较慢

问题描述

我正在制作一个 cookie 点击器副本。

发生的情况是我使用 ayield return new WaitForSeconds (0.1f)每秒将 cookie 添加到 cookie 计数器,并且我希望它们以快速的方式添加,而不是每秒添加。

问题是当我在我的电脑上运行它时,它运行良好,但是当我在我的安卓上运行它时,它会慢慢地将 cookie 添加到计数器中。

据我所知,我会说它与FPS有关。我尝试在(Time.deltaTime * 0.1f), 内部使用WaitForSeconds,但它在 android 中仍然运行缓慢。也尝试使用该Invoke()方法,但它也很慢。

(我有StartCoroutine里面的Update方法。)(当我放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);
 }

标签: c#unity3dcoroutine

解决方案


您正在调用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 时间,可以实现每 0.1 秒的协程常量 cookie 增加。您需要非常注意管理该无限循环协程。(此代码未经测试,但应该给你一个大致的想法)

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,因为与较慢 fps 的机器相比,计算更高的复合 cookie 兴趣的频率更高。

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


推荐阅读