You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:42:18