Godot引擎中如何实现Thread线程暂停指定秒数?
Godot 实现线程/流程暂停指定时长的实现方法
分两种常见场景对应处理,不要混用,不然会出现程序卡死、线程安全报错的问题:
非独立线程的普通流程延时(主线程/协程场景)
这个场景是绝大多数人写游戏逻辑会碰到的需求,比如触发剧情后等2秒再刷怪、按钮点击后等1秒再切场景,绝对不要写空循环卡时间,会直接占满主线程导致画面冻住、输入无响应,最稳妥的实现是用引擎自带的异步等待:
# 等待3秒后再执行后续代码,不会阻塞主线程的渲染、输入响应 await get_tree().create_timer(3.0).timeout print("等待结束,继续执行后续逻辑")
如果节点下已经挂了配置好的Timer节点,也可以直接等待Timer的超时信号:
$Timer.wait_time = 2.5 $Timer.start() await $Timer.timeout print("2.5秒等待结束")
独立Thread工作线程的暂停/休眠
自己通过Thread.start()拉起的工作线程,不能直接调用场景树相关的create_timer(),也不能直接操作主线程的节点对象,否则会触发线程安全崩溃,按你的需求选下面两种方式:
- 不需要中途唤醒的固定时长休眠:直接用OS层面的线程休眠接口,不会空转占CPU,精度满足绝大多数游戏逻辑需求
func _my_worker_thread(): print("工作线程启动,先休眠2秒") OS.delay_msec(2000) # 参数单位为毫秒,2000即2秒 # 需要更高精度可以用微秒级接口:OS.delay_usec(2000000) 同样对应2秒 print("休眠结束,继续执行计算、IO等线程安全任务")
- 需要支持中途唤醒、提前终止等待的场景:用
Semaphore做带超时的等待,既可以实现定时暂停,也能随时通过信号唤醒线程处理指令
var _thread_semaphore := Semaphore.new() var _thread_alive := true func _my_worker_thread(): while _thread_alive: # 最长等待3秒,3秒内收到唤醒信号就立刻返回,没收到就超时往下执行 var ret = _thread_semaphore.wait(3000) if ret == OK: # 被主动唤醒,先检查是否要退出线程 if not _thread_alive: break # 处理其他主线程发过来的指令 else: # 等待超时,执行定时轮询的任务 print("3秒定时到,执行线程任务")
注意:工作线程里不要直接操作任何场景节点、UI控件,如果休眠结束后需要修改节点状态,一定要用
call_deferred()把对应操作切回主线程执行。
内容的提问来源于stack exchange,提问作者MomoVR
相关产品推荐
相关产品推荐

