我想在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_msec
或OS.get_ticks_usec
,以决定何时使用yield
。
假设你想完全避免物理帧和图形帧,你可以创建一个Thread
,并让它与OS.delay_msec
或OS.delay_usec
一起休眠。对于抽象,你可以做一个无限循环,每次迭代调用一个delay,然后做任何你想做的事情。
我制作了一个秒表类,作为Gamedev的答案,你可以使用或基于你的代码。它有一个"tick"
信号,并测量运行时间,支持暂停,恢复,停止和再次启动。它不适合短时间间隔。它的设计目标是存档更低的速率和更低的CPU使用率,而不仅仅是检查每帧的时间。
我希望它根据计算机的运行速度进行更改
如果你看到一个无限循环的Thread
,没有延迟…嗯,它会尽可能快地运行。