【问题标题】:Is there a way to run a separate Update at a faster rate than the Application.targetFrameRate?有没有办法以比 Application.targetFrameRate 更快的速度运行单独的更新?
【发布时间】:2021-12-27 19:42:17
【问题描述】:

我希望在最后几帧中轮询 Unity 输入,并使用该数据来解释用户的按钮按下。然而,根据我的测试,感觉就像以应用程序的 60 FPS 帧速率进行轮询会导致错过一些非常快速的输入。

简单示例,用户尝试从 Down 前进:

frame 1 - user is holding Down
frame 1.5 - user taps Forward, but hasn't released Down yet
frame 2 - user lets go of Down and has reached Forward fully

在我当前的设置中,使用统一的帧率更新,用户同时按住向下和向前的帧 1.5 完全错过了。有没有办法运行单独的更新,运行速度比常规的 Unity MonoBehaviour 更新功能更快?或者是否需要不同的解决方案,例如通过事件查询(iirc 是一个选项,但我可能记错了)?

【问题讨论】:

  • 你能分享你的代码吗?不,你不能(不是内置输入系统)。但是:实际上没有 1.5 帧这样的东西......如果用户在最后一帧之后按下并释放了一个按钮,那么在下一个更新调用中 Input.GetButtonDownInput.GetButtonUp 都将返回 true!所以我认为问题在于你如何实现 Input .. 或者我的问题是:如果没有要为它渲染的框架,你为什么认为 Input 很重要,那么它应该有什么效果/影响?
  • 我认为在这种情况下共享代码不会有帮助。我对 1.5 帧的观点是,在某些设备上可以以 1 毫秒的频率读取输入,这比单帧要精细得多。当您说输入系统无法解决此问题时,我明白您的意思。
  • 正如我所说 .. 输入系统 确实 说明了这一点,并告诉您自上一帧以来该键已被按下并已释放 .. 所以您绝对可以从中扣除在最后一帧的某个时刻,同时按下了两个键......我的问题是:你为什么要关心?你的游戏玩法到底有什么变化?
  • 它会改变游戏的响应能力,如果您在多个帧上解释输入,可能会给游戏带来不好的感觉,例如街头霸王中四分之一圈的向前运动
  • 我不知道《街头霸王》中四分之一圈的向前运动是什么样子的 tbh ^^ 但不,我仍然不明白这一点

标签: unity3d


【解决方案1】:

我认为在传统输入系统中将轮询频率与帧速率分离是不可能的,但是在新输入系统中,有一个 pollingFrequency 属性允许您以赫兹为单位定义频率。它使用后台线程来轮询数据。您还需要订阅输入操作更改并在那里记录您的值,以便最终在更新方法中使用它们。

【讨论】:

  • 这个“新输入系统”是什么?如果我要在更新方法中使用输入,那不会回到以应用程序的帧速率进行轮询的原始问题吗?还是您指的是单独的后台线程更新,而不是通用的 MonoBehaviour 更新?
  • 你是对的,这就是为什么你需要订阅一些事件,一个更高频率的后台线程会调用这个事件
  • 谢谢,我看看能不能在我目前的实现中使用它
  • 老实说,我仍然没有真正得到你预期的收益是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 2017-12-03
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多