Defold游戏生命周期非常简单,就分为三个阶段: init -> update -> final。
graph TD
Init --> Update
Update --> Final
Update --按帧更新--> Update
在游戏启动时进行Init阶段,然后在游戏运行过程中,每一帧的更新操作都属于Update阶段,最后在游戏关闭时才进入Final阶段进行资源释放。
Init初始化阶段
Defold游戏引擎启动之后,会进行自身的一系列初始化,包含:内存分析、图像、输入设备、声音等等,这些都是我们不可控制的。开发者第一次能与游戏引擎进行交互的位置就是init阶段。
当Defold加载我们配置的入口Collection时,就会调用这个Collection以及其中包含的所有组件的init方法,只要申明了init方法的都会在此次被调用。但是,需要注意的是,这个init方法的执行顺序是不保证的,而且与组件在Collection中的位置也没有关系。 Defold确保所有init方法都被调用了,但是不保证先后顺序。
在Init阶段除了进行初始化之外,也可以通过消息系统完成CollectionProxy的加载与卸载操作。如下代码所示:
function init(self)
msg.post("#collectionproxy", "load")
end
function update(self)
end
function on_message(self, message_id, message, sender)
if message_id == hash("proxy_loaded") then
-- 执行某些逻辑
msg.post("#collectionproxy", "enable")
msg.post("#collectionproxy", "disable")
msg.post("#collectionproxy", "unload")
end
end
总结一下:
- Init方法的调用顺序是不保证的,与Component在Collection中的位置无关,但是一定会被调用。
- Init方法中可以完成CollectionProxy的加载、启用、禁用、卸载的生命周期。
Update阶段
游戏执行的每一帧都会调用update方法。每秒帧率可以game.project配置文件中配置。如果在game.project中配置了物理模拟固定时间步,那么还会调用fixed_update方法。每秒的帧率还可以通过向@system发送set_update_frequency消息以修改帧率。
在Update阶段,update或fixed_update方法中都可以得用消息系统向其他组件发送消息。
另外,在Update阶段所有来自于用户的输入,都会通过on_input方法分发到所有实现了on_input方法的组件。同样,先后顺序不保证。
总结一下:
- Update阶段的update方法是按设定帧率运行的,所有组件的upadte方法调用顺序不保证。
- Update阶段的fixed_update方法是按物理模拟时间步执行的,也不保证顺序。
- Update阶段的on_input方法也是不保存顺序的。
Final阶段
在Final会卸载所有Collection与CollectionProxy,如果组件有实现final方法,也会无序进行调用。