如何使一个函数运行在自定义fps在Godot使用Gdscript



我想在Godot中创建一个计时器函数,它将使用计算机的帧速率,以便以我选择的任何fps(例如60 fps)运行代码。到目前为止,我有一个基本定时器的代码:

var t = Timer.new()
t.set_wait_time(time)
t.set_one_shot(true)
self.add_child(t)
t.start()
yield(t, "timeout")
t.queue_free()

然而,而不是让时间变量是一个固定的数字,我希望它根据计算机运行的速度或帧之间的时间来改变。

我想在Godot中创建一个计时器函数,它将使用计算机的帧速率

这将是_process中的代码。如果您在项目设置中启用了VSync(在Display ->窗口→Vsync(默认启用),_process将每帧运行一次。

以我选择的任意fps运行代码(例如60 fps)

那就不是电脑的帧率,而是你说的帧率。为此,您可以使用_physics_process,并在项目设置中配置速率(在物理->常见的→物理Fps,默认为60)。


如果你想让某些东西每帧运行X次,那么我建议根据你的需要在_process_physics_process中调用它X次。

我希望它根据(…)帧之间的时间来改变。

您还可以使用delta来了解帧之间的时间,并根据该时间来决定运行代码的次数。


如果您想使用Timer,您可以将process_mode设置为Physics以将其与物理帧速率绑定。Idle将使用图形帧率。


从你的代码看来,你不想连接到"timeout"信号,而是yield。在这种情况下,您可能对以下内容感兴趣:

yield(get_tree(), "idle_frame")

将继续执行下一个图形帧。

还是……

yield(get_tree(), "physics_frame")

这将继续执行下一个物理帧。

哎呀,通过这样做,您可以将所有逻辑放在_ready上,而根本不使用_process_physics_process。当然,我不建议这样做。


如果你想要一个比图形和物理帧更快的速率,那么我建议你检查OS.get_ticks_msecOS.get_ticks_usec,以决定何时使用yield


假设你想完全避免物理帧和图形帧,你可以创建一个Thread,并让它与OS.delay_msecOS.delay_usec一起休眠。对于抽象,你可以做一个无限循环,每次迭代调用一个delay,然后做任何你想做的事情。

我制作了一个秒表类,作为Gamedev的答案,你可以使用或基于你的代码。它有一个"tick"信号,并测量运行时间,支持暂停,恢复,停止和再次启动。它不适合短时间间隔。它的设计目标是存档更低的速率和更低的CPU使用率,而不仅仅是检查每帧的时间。


我希望它根据计算机的运行速度进行更改

如果你看到一个无限循环的Thread,没有延迟…嗯,它会尽可能快地运行。

最新更新