标签:多线程
-
混音线程:AudioServer 的锁竞争实测 —— 音频线程和游戏线程的边界
音频线程每 10.7ms 必须完成一次混音,游戏线程的任何鲁莽 API 调用都可能去抢同一把锁。这篇拆 AudioServer 的线程模型、哪些调用真会进临界区、以及一个放大锁竞争的实测方法。
-
TaskGraph 与并行:NamedThread/AnyThread 的任务调度
TaskGraph 的前置依赖调度模型、NamedThread 的固定角色分工,以及引擎内并发编程的正确姿势。
-
RenderingDevice 多线程提交的限制与坑
RD 的类上挂着 _THREAD_SAFE_CLASS_,方法级互斥没问题,但"同时只能有一个活动列表"和"submit 顺序即 GPU 顺序"两条约束决定了它不能被当成自由的多线程图形 API。这篇列四条实战规则,以及每条背后的源码依据。
-
多线程基础设施:WorkerThreadPool 与 TaskGroup
WorkerThreadPool 是引擎内部所有"扔给后台干"的活儿的统一入口,这篇讲它的任务队列、Group 语义,以及为什么引擎不用 std::async 也不让业务自己起线程。
-
call_deferred 与消息队列:延迟调用的实现与 flush 时机
call_deferred 不是定时器,是把 Callable 塞进一条全局 FIFO 消息队列;队列在一帧的固定时点上被 flush,回调运行期改树是主要用途,队列满了引擎会直接崩。
-
线程化资源加载:`load_threaded_request` 的状态机与令牌
load_threaded_request 把资源加载挪到后台线程,主线程靠状态轮询拿结果。这篇讲 ThreadLoadTask 的状态机、三个公开 API 的调用契约,以及它为什么解决不了"加载瞬间的卡顿"的全部问题。
-
Mutex/RWLock 封装与服务器线程模式:thread_safe 编译宏的影响
Godot 的锁不是 std::mutex 的直接包装,而是一套带"可编译期消除"语义的封装,这篇讲 Mutex/RWLock 的分层、THREAD_SAFE 宏如何让锁在单线程构建里消失,以及服务器的线程模式设置。
-
渲染线程模型:GameThread/RenderThread/RHIThread 的边界
三条线程各自干什么、ENQUEUE_RENDER_COMMAND 背后是什么队列、帧同步栅栏怎么保证游戏线程不踩渲染线程。