如何使用 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_msec
或OS.get_ticks_usec
来决定何时使用yield
。
假设您想要完全避免物理帧和图形帧,您可以创建一个 Thread
并让它与 OS.delay_msec
或 OS.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
有一个无限循环,没有延迟......好吧,它会 运行 尽可能快 运行。
我想在 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_msec
或OS.get_ticks_usec
来决定何时使用yield
。
假设您想要完全避免物理帧和图形帧,您可以创建一个 Thread
并让它与 OS.delay_msec
或 OS.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
有一个无限循环,没有延迟......好吧,它会 运行 尽可能快 运行。