SuperAPI AI 工具集

multithreading

编程与开发

查看项目

更新于 10-15 22:40

技能介绍

用途:在 Godot 中把昂贵计算移出主线程,同时保证场景树安全。优先用 WorkerThreadPool 处理短时并行任务,只有需要长期工作线程时才用 Thread/Mutex/Semaphore。

核心安全规则:主线程独占场景树,场景树操作非线程安全。仅当在项目设置中启用后,RenderingServer、PhysicsServer 才线程安全;NavigationServer 线程安全,可调 Max Threads;AStar2D/3D/Grid2D 非线程安全,每个对象只能一个专用线程;GDScript 的 Array/Dictionary 读写已有元素可以,增删改大小需要 Mutex;不在主线程外做 GPU 工作。跨线程结果回传用 call_deferred / set_deferred,场景树只允许主线程修改。

WorkerThreadPool:全局单例,启动时分配线程。add_task 跑单工作线程,add_group_task 按元素索引分配。每个任务必须 wait_for_task_completion / wait_for_group_task_completion,否则资源泄漏;只对真正昂贵的工作使用。

Thread/Mutex/Semaphore:start(callable, priority)、wait_to_finish()(阻塞、释放前 join)、Mutex 可重入、Semaphore 提供 wait()/post()。C# 可用 System.Threading,但不要从后台线程触碰 Godot 对象或用 ToSignal。

线程化资源加载:用 load_threaded_request 启动,每帧轮询 load_threaded_get_status(progress[0] 为 0–1),状态为 THREAD_LOAD_LOADED 时才调用 load_threaded_get;未完成时该调用会阻塞。

限制与背景:Godot 4.7 修复了若干线程加载问题(GH-119757、GH-120077、GH-118824、GH-119394),API 未变,旧的绕过方案需在 4.7 重新测试。线程创建慢,应预创建;避免过度加锁。C# 纯 CPU 任务可偏好 Task.Run 并 CallDeferred 回主线程。使用前应先做性能分析确认确属 CPU 昂贵工作。该技能为 Godot 专用,不涉及其他引擎或语言;具体平台、收费与版本细节资料未提供。