我的协程在 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 应用程序上运行速度较慢的主要内容,如果未能解决你的问题,请参考以下文章