如何使用游戏更新调度
Dora SSR 提供了灵活的调度机制,让开发者可以方便地控制游戏逻辑的更新。本教程将带你了解如何使用游戏更新调度系统,包括异步处理的协程任务和每帧重复调用的更新函数。
1. 理解游戏更新调度
游戏更新调度是游戏引擎中用于管理和执行游戏逻辑更新的机制。它允许开发者在每一帧或特定条件下执行代码,从而实现动态的游戏体验。游戏引擎的本质就是一个不间断的循环程序,每一次循环称为一帧,游戏逻辑的更新就是 在每一帧中进行的。
一个典型的游戏逻辑更新流程如下,在 60 帧执行的引擎下,这个流程会在每秒执行 60 次:
2. 协程任务与更新函数的区别
- 协程任务(Coroutine Tasks):
- 异步处理:可以在多个帧之间暂停和恢复。
- 使用场景:适合处理需要等待的操作,如加载资源、计时器等。
- 实现方式:通过
thread
、threadLoop
、once
、loop
等函数。
- 更新函数(Update Functions):
- 同步处理:在每一帧都会被调用。
- 使用场景:适合处理每帧都需要更新的逻辑,如移动、碰撞检测等。
- 实现方式:通过
node:schedule()
、node:onUpdate()
函数。
3. 使用协程任务实现异步处理
协程任务允许您在执行过程中暂停,等待条件满足或一定的时间,然后继续执行。允许你在不阻塞主线程的情况下执行耗时操作。这对于处理异步事件非常有用。
3.1 全局协程任务与节点 关联的协程任务
在 Dora SSR 中,协程任务的执行有两种方式:
- 全局协程任务:使用
thread(function() ... end)
创建的协程任务,其生命周期由引擎的全局调度模块管理。除非手动移除,这些任务会一直运行,直到引擎退出时才会清理所有正在执行的调度。 - 节点关联的协程任务:使用
node:schedule(once(function() ... end))
创建的协程任务,其生命周期与关联的节点相同。当节点被清理时,调度在其上的函数也会被停止并清理。
示例:执行一个全局协程任务
- Lua
- Teal
- TypeScript
- YueScript
local thread <const> = require("thread")
local sleep <const> = require("sleep")
local Content <const> = require("Content")
thread(function()
print("开始异步加载资源")
local resourceData = Content:loadAsync("path/to/resource")
sleep(2) -- 模拟额外的耗时操作
print("资源加载完成")
-- 在资源加载完成后执行后续逻辑
end)