c# - 我的协程在 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);
}
解决方案
您正在调用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中。
推荐阅读
- c++ - 如何解决预编译头错误
- flutter - Flutter Firestore:如何做类似于 where('fieldName', arrayNotContains: 'something') 的事情?
- r - kable 表未正确显示在 github 上
- arrays - 在 AWK 中打印数组中的所有元素
- elasticsearch - 我如何管理弹性搜索中的布尔查询
- python - 来自JSON的电报python检查键值
- javascript - FullCalendar V3 滚动条上弹出更多事件不起作用
- java - 无法创建到 MySQL 数据库服务器的 JDBC 连接
- angular - Angular Material Date Range Picker 设置默认值
- powershell - 如何删除powershell中的最后一个逗号?