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

Posted

技术标签:

【中文标题】我的协程在 Unity android 应用程序上运行速度较慢【英文标题】:My coroutine is running slower on Unity android aplication 【发布时间】:2021-11-03 02:46:06 【问题描述】:

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

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

问题是,当我在我的电脑上运行它时,它运行良好,但是当我在我的安卓上运行它时,它会慢慢地将 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);
 

【问题讨论】:

你在更新中启动了一个协程。那可能会变坏。您需要进行调试并显示它和您的代码。 我坚持了一段时间,我也尝试将协程放在 start 方法中,但我需要每秒添加 cookie,为此我还在 IEnumerator 中尝试了一段时间但没有任何工作正常 您还没有读过其中大部分内容是如何工作的。在协程中放置一个循环并在开始时启动它。并放弃额外的收益 不要使用协程,因为它们会从 c# 开发人员的角度教坏习惯,并且很可能会导致常规 c# 工作中的私刑 【参考方案1】:

您正在从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 兴趣的频率更高.

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

【讨论】:

伙计,你真的救了我,FixedUpdate() 是解决方案,这很奇怪,因为我之前已经尝试过了,但现在它可以工作了 tsm

以上是关于我的协程在 Unity android 应用程序上运行速度较慢的主要内容,如果未能解决你的问题,请参考以下文章

“无法访问主线程上的数据库,因为它可能会长时间锁定 UI。”我的协程错误

Unity:为啥协程在所有 Start() 函数之后结束?

unity 同一时间 能有几个协程

Unity的协程详解

在foreach循环Unity3D C#中的协程

lua学习之协同程序