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