Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
空闲处理与物理处理¶
游戏是使用循环来运行的。每一帧,你都需要先更新游戏世界的状态,然后再把它画到屏幕上。Godot 在 Node 类中提供了两个虚方法来完成这项工作:Node._process() 和 Node._physics_process()。如果你在脚本中定义了其中之一或者两者都定义了,引擎就会自动进行调用。
你可以使用两种类型的处理:
空闲处理(Idle processing)可以用来执行每帧更新节点的代码,执行频率会尽可能地快。
物理处理(Physics processing)的频率是固定的,默认为每秒 60 次。它和游戏的实际帧率无关,可以让物理平滑执行。任何与物理引擎相关的东西都应该用它,比如移动可能与环境相碰撞的实体。
在脚本中定义 _process()
方法就会激活空闲处理。可以通过调用 Node.set_process() 来进行开关。
每次引擎需要绘制一帧的时候就会调用该方法:
func _process(delta):
# Do something...
pass
public override void _Process(double delta)
{
// Do something...
}
请记住,引擎调用 _process()
的频率以应用的帧率为准,可能根据时间的变化、设备的变化而变化。
函数的参数 delta
是从上一次调用 _process()
开始所经过的秒数。借助这个参数就可以进行与帧率无关的计算。例如,为移动物理做动画时,应该始终将速度值乘上 delta
。
物理处理使用的是类似的虚函数:_physics_process()
。可用于必须在每一次物理迭代前进行的计算,比如移动可能与游戏世界发生碰撞的角色。前面提到过,为了实现平稳的物理交互,_physics_process()
的执行间隔是尽可能固定的。你可以在“项目设置”的“Physics -> Common -> Physics Fps”(物理 -> 常规 -> 物理 FPS)中修改物理迭代之间的间隔。默认设置是每秒 60 次。
The engine calls this method before every physics step:
func _physics_process(delta):
# Do something...
pass
public override void _PhysicsProcess(double delta)
{
// Do something...
}
_process()
函数没有与物理进行同步,频率会受到硬件和游戏优化的影响。在单线程游戏中,会在物理迭代后执行。
要观察 _process()
的执行,可以创建一个只有一个 Label 节点的场景,把下面的脚本附加给它:
extends Label
var time = 0
func _process(delta):
time += delta
text = str(time) # 'text' is a built-in Label property.
using Godot;
public partial class CustomLabel : Label
{
private double _time;
public override void _Process(double delta)
{
_time += delta;
Text = _time.ToString(); // 'Text' is a built-in Label property.
}
}
运行场景,你应该就会看到一个每帧都会增加的计数器。