【问题标题】:How to make a function run at custom fps in Godot using Gdscript如何使用 Gdscript 在 Godot 中以自定义 fps 运行函数
【发布时间】:2021-10-21 07:40:14
【问题描述】:

我想在 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 gdscript


    【解决方案1】:

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

    那将是_process 中的代码。如果您在项目设置中启用了 VSync(在 Display -> Window -> 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 一起休眠。对于抽象,你会做一个无限循环,每次迭代调用一个延迟,然后做任何你想做的事情。

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


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

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

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多