空闲处理与物理处理

Games run in a loop. Each frame, you need to update the state of your game world before drawing it on screen. Godot provides two virtual methods in the Node class to do so: Node._process() and Node._physics_process(). If you define either or both in a script, the engine will call them automatically.

你可以使用两种类型的处理:

  1. 空闲处理(Idle processing)可以用来执行每帧更新节点的代码,执行频率会尽可能地快。

  2. 物理处理(Physics processing)的频率是固定的,默认为每秒 60 次。它和游戏的实际帧率无关,可以让物理平滑执行。任何与物理引擎相关的东西都应该用它,比如移动可能与环境相碰撞的实体。

在脚本中定义 _process() 方法就会激活空闲处理。可以通过调用 Node.set_process() 来进行开关。

每次引擎需要绘制一帧的时候就会调用该方法:

GDScriptC#

  1. func _process(delta):
  2. # Do something...
  3. pass
  1. public override void _Process(double delta)
  2. {
  3. // Do something...
  4. }

请记住,引擎调用 _process() 的频率以应用的帧率为准,可能根据时间的变化、设备的变化而变化。

函数的参数 delta 是从上一次调用 _process() 开始所经过的秒数。借助这个参数就可以进行与帧率无关的计算。例如,为移动物理做动画时,应该始终将速度值乘上 delta

物理处理使用的是类似的虚函数:_physics_process()。可用于必须在每一次物理迭代前进行的计算,比如移动可能与游戏世界发生碰撞的角色。前面提到过,为了实现平稳的物理交互,_physics_process() 的执行间隔是尽可能固定的。你可以在“项目设置”的“Physics -> Common -> Physics Fps”(物理 -> 常规 -> 物理 FPS)中修改物理迭代之间的间隔。默认设置是每秒 60 次。

The engine calls this method before every physics step:

GDScriptC#

  1. func _physics_process(delta):
  2. # Do something...
  3. pass
  1. public override void _PhysicsProcess(double delta)
  2. {
  3. // Do something...
  4. }

_process() 函数没有与物理进行同步,频率会受到硬件和游戏优化的影响。在单线程游戏中,会在物理迭代后执行。

要观察 _process() 的执行,可以创建一个只有一个 Label 节点的场景,把下面的脚本附加给它:

GDScriptC#

  1. extends Label
  2. var time = 0
  3. func _process(delta):
  4. time += delta
  5. text = str(time) # 'text' is a built-in Label property.
  1. using Godot;
  2. public partial class CustomLabel : Label
  3. {
  4. private double _time;
  5. public override void _Process(double delta)
  6. {
  7. _time += delta;
  8. Text = _time.ToString(); // 'Text' is a built-in Label property.
  9. }
  10. }

运行场景,你应该就会看到一个每帧都会增加的计数器。

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.