如何使用 Gdscript 在 Godot 中以自定义 fps 制作函数 运行

How to make a function run at custom fps in Godot using 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()

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

I want to make a timer function in Godot that would use the computers frame rate

那将是 _process 中的代码。如果您在项目设置中启用了 VSync(在显示 -> Window -> Vsync 下,默认情况下启用),_process 将每帧 运行 一次。

run code at whatever fps I choose (ex. 60 fps)

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


如果你想要的是每帧 运行 X 次,那么我建议只在 _process_physics_process 中调用它 X 次,具体取决于您的需求。

I would like it to change based on (...) time between frames.

您还可以使用 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 休眠。对于抽象,你会做一个无限循环,每次迭代调用一个延迟,然后做任何你想做的事。

我为 an answer on Gamedev 制作了一个秒表 class,您可以使用它或将其作为您的代码的基础。它有一个 "tick" 信号,并测量 运行ning 时间,支持暂停、恢复、停止和重新启动。它没有针对短时间间隔进行优化。它的设计目标是用更低的 CPU 使用率来存档,而不是仅仅检查每一帧的时间。


I would like it to change based on how fast the computer can run

如果你看到一个 Thread 有一个无限循环,没有延迟......好吧,它会 运行 尽可能快 运行。