当前位置: 首页 > news >正文

Unreal对C++做了什么 · Part3工具箱 · 第 12 章 · 多线程:Unreal 不用 std::thread

第 12 章 · 多线程:Unreal 不用 std::thread

游戏引擎是天然的多线程系统。渲染、物理、动画、音频、网络在不同线程上并行。C++11 有std::threadstd::async,C++17 有并行算法——但 Unreal 几乎不用它们。

多线程与容器、委托、日志一样,是 Unreal 对 C++ 的改造之一。Unreal 没有增加新的并发关键字,但对「怎么写多线程 C++」做了硬性规定:线程有角色(GameThread / RenderThread / 工作线程池),跨线程须显式派发,修改 UObject 与大部分引擎 API 只能在 GameThread。这直接约束了你的并发代码写法,并与 UObject 安全、渲染管线绑定。本章讲这套改造的动机与替代关系。


12.1 为什么不用 std::thread

线程有角色,不是"谁有空谁干"

通用程序里线程池是"一堆等价的工作线程"。游戏引擎里线程是有名字、有职责的:

  • GameThread:游戏逻辑、蓝图、Tick、Spawn/Destroy、修改 UObject。绝大部分你写的代码都在这条线程上。
  • RenderThread:提交渲染命令、管理渲染资源。
  • RHIThread:与图形 API(D3D12/Vulkan/Metal)直接交互。
  • 工作线程池:物理、动画、寻路等可并行的计算。

某些 API只能在特定线程调用。在 GameThread 上调图形 API 会崩溃,在 RenderThread 上改 UObject 也会崩溃。std::thread不表达"这是哪条线程",也无法按名字把任务派发到指定线程。

帧同步与平台抽象

引擎按帧运行,每帧内逻辑→渲染→呈现有严格顺序,需要显式同步点,而不是"有空就算"。此外,主机和移动平台对线程的栈大小、优先级、亲和性有各自 API,Unreal 用一层抽象(FRunnableThread::Create等)统一处理,而不是在每个平台手写std::thread的替代品。

所以 Unreal 的改造是:用"线程角色 + 命名调度"替代"匿名线程池 + std::thread"——系统性地规定了你用哪套 API、遵守哪些约束,与 TArray 替代 std::vector、委托替代 std::function 同属一列。


12.2 Unreal 用什么替代

需求标准 C++Unreal要点
长期运行的独立线程std::threadFRunnable+FRunnableThread::Create可指定线程名、栈大小、优先级;适合后台 IO、网络、流式加载
一次性异步任务std::async+std::futureFAsyncTask<T>/FAutoDeleteAsyncTask<T>任务提交到引擎线程池,可等待完成或轮询;生命周期由引擎或FAutoDelete管理
数据并行(对数组每项做一件事)std::for_each(std::execution::par, ...)ParallelFor(N, Lambda)不依赖 STL 并行实现,跨平台一致;Lambda 内不能碰非线程安全资源、不能调仅限 GameThread 的 API
依赖驱动的任务图TaskGraph引擎内部渲染、物理、动画用 DAG 调度;应用层较少直接使用
跨线程派发到"某条命名线程"AsyncTask(ENamedThreads::GameThread, []{...})从工作线程回到 GameThread 必须显式派发;修改 UObject 必须在 GameThread

同步原语方面:FCriticalSection对标std::mutexFThreadSafeBoolTAtomic<T>用于简单共享状态。API 与标准库接近,不赘述。

对写代码的直接影响:默认情况下你的逻辑都在 GameThread,无需考虑线程安全;一旦用FAsyncTaskParallelFor,结果要写回 UObject 或调引擎 API 时,必须用AsyncTask(ENamedThreads::GameThread, ...)回到 GameThread。这是 Unreal 对 C++ 并发写法的硬性规定,与「UObject 用 NewObject、引用用 UPROPERTY」一样,属于方言的约束。


12.3 小结:多线程作为改造的一条

多线程没有新语法、没有 UHT 生成代码,但算改造:Unreal 换掉了你该用的并发 API(FRunnable/FAsyncTask/ParallelFor/TaskGraph + 按名调度),并硬性规定「线程有角色、跨线程须显式派发」。这与 UObject 和渲染管线的安全直接相关。具体 API 用法见引擎文档;本书强调一点:多线程下接触 UObject 或渲染,先问「当前在哪个线程、该用哪种派发」。


一句话总结

多线程与 TArray、委托、日志等并列,是 Unreal 对 C++ 的改造之一:用「线程角色 + 命名调度」替代 std::thread 的匿名模型,用 FRunnable/FAsyncTask/ParallelFor 替代 std::thread/std::async,硬性约束是修改 UObject 与大部分引擎 API 只能在 GameThread、跨线程须显式派发。

http://www.jsqmd.com/news/471147/

相关文章:

  • 新手必看:Qwen3-Reranker-0.6B在Dify中的完整集成与调用指南
  • CLIP-GmP-ViT-L-14在互动艺术装置中的应用:视觉与诗歌的实时对话
  • Gemma-3-12B-IT惊艳效果:用‘把这篇论文摘要转成通俗易懂的100字介绍’精准执行
  • 基于相空间重构和黏菌算法优化小波神经网络(SMA-WNN)短时交通流量预测附Matlab代码
  • 靠谱的塑料袋编织袋撕碎机生产企业,如何选择? - 工业品网
  • 用快马平台十分钟搭建免费在线doc查看器原型
  • 苏州大学国际学院2+2靠谱吗,2026年口碑全面解读 - 工业设备
  • VisualGGPK2:游戏资源编辑的创新方法
  • 【无人机路径规划】复杂三维山地环境下蚁群优化算法ACO求解多无人机动态避障路径规划研究附MATLAB代码
  • DCT-Net人像卡通化效果展示:支持SVG矢量导出与无限缩放
  • CHORD-X系统LaTeX技术文档自动化生成实践
  • 分析北京房产确权纠纷律师排名,哪家口碑好且性价比高 - 工业品网
  • 基于Git-RSCLIP的智能文档管理系统:快速定位含图文档
  • Hotkey Detective:智能诊断热键冲突的系统优化工具
  • 东星制冷的研发投入大吗,它的产品好用吗 - mypinpai
  • STM32U3指令缓存与电源控制深度解析:寄存器配置、错误处理与低功耗协同
  • gte-base-zh与Git版本结合:管理AI模型迭代中的文本特征
  • 快速原型:利用快马AI一键生成CentOS服务器环境初始化脚本
  • 【预测模型】基于ARIMA模型的股票价格预测
  • 2026年上海价格实惠的婚纱摄影推荐,选购攻略来了 - 工业设备
  • 华夏通盈利能力、全国网点及特色大揭秘,费用到底多少钱 - 工业推荐榜
  • 实战指南:基于快马平台构建电商用户行为分析与可视化系统
  • 求解开放式车辆路径问题的鲸鱼优化算法附Matlab代码
  • 2026板材清洗机制造厂家大比拼,谁更胜一筹?,市场清洗机关键技术和产品信息全方位测评 - 品牌推荐师
  • 华夏通物流费用怎么算,在云南各地选择要考虑啥 - 工业品牌热点
  • 3个核心价值:RedPanda-CPP调试模块的架构解密与实践指南
  • 南宁引流获客平台费用多少,如何选择性价比高的 - myqiye
  • VideoAgentTrek-ScreenFilter应用场景:智能座舱测试中多屏协同内容一致性验证
  • nomic-embed-text-v2-moe部署教程:Kubernetes集群中Ollama StatefulSet编排
  • 智能客服后端架构设计:从零搭建高可用对话系统