
简单对照写法异步多线程计算普通函数调用否否AsyncTask(GameThread, ...)是否仍在 Game ThreadAsync(ThreadPool, ...)是是通常由工作线程执行ParallelFor(...)通常用于并行是Future.Get()会等待不一定AsyncTask一次性短任务适合任务只执行一次任务执行时间较短不需要自己管理线程生命周期任务完成后执行一个回调Task Graph / UE Tasks多个任务有依赖关系适合有多个任务任务之间存在先后依赖某些任务可以同时执行需要等待多个任务全部完成需要组织复杂的任务流程例如任务 A计算碎片面积 ↓ 任务 B汇总总面积 任务 C生成 Mesh 任务 D生成碰撞 ↓ 任务 E提交结果FRunnable长期运行的专用线程适合线程需要长期存在线程不断等待新任务有自己的运行循环需要持续处理网络、设备、文件流等数据任务不是执行一次就结束普通数据TArrayFVector Vertices;你可以规定Worker Thread 独占写入 Game Thread 等完成后读取不会有 UE 对象系统参与。UE 组件UDynamicMeshComponent* Component;它不是一块独立内存还连接着Actor World UObject 生命周期 渲染状态 物理状态 组件注册表Worker Thread 创建它时不只是“分配一块内存”而是在修改整个 UE 场景。具体会发生什么你写UDynamicMeshComponent* Component NewObjectUDynamicMeshComponent(Owner); Component-RegisterComponent();表面上只有两行实际上会涉及创建 UObject 把组件挂到 Owner 把组件注册到 World 通知渲染系统创建渲染状态 通知物理系统创建碰撞状态 更新 Actor 的组件关系与此同时Game Thread 可能正在遍历 Actor 更新组件 销毁对象 切换关卡 处理碰撞 执行垃圾回收如果两个线程同时修改这些内部状态就会出现线程 A正在添加组件 线程 B正在遍历组件结果可能是数据竞争数组被同时修改随机崩溃组件注册不完整渲染状态丢失Chaos 碰撞状态异常不能在 Worker Thread 直接做的事情总结通常要回到 Game Thread 的包括Actor 创建、销毁、修改 Component 创建、注册、销毁 UObject 生命周期操作 World 和 Level 修改 实时射线检测 材质、渲染状态修改 Chaos 物理状态修改 输入、计时器、Timeline Gameplay Framework 网络复制和 RPC AI、导航、行为树 动画组件 音频组件 编辑器资源操作 委托绑定和广播但是上面的内容可以只读不修改Worker Thread 适合做的事情适合放后台的通常是纯数学计算 字符串解析 文件数据解析 JSON 解析 网格顶点计算 三角形计算 二维 polygon 生成 碰撞几何数据生成 纹理像素数据处理 路径算法的纯数据部分 批量数组计算 排序、过滤、统计1. 串行只有一个流程前一步完成后才执行下一步时间 → 游戏线程 准备数据 ── 射线0 ── 射线1 ── 射线2 ── 绘制 RT特点同一时间只有一个步骤在执行2. 并发多个任务在时间上重叠但不一定同时运行。例如只有一个 CPU 核心系统在两个任务之间快速切换时间 → 线程 0 任务 AA1 ── A2 ──暂停──── A3 ── A4 任务 B B1 ── B2 ─────── B3这里 A 和 B 都在“进行中”但同一时刻实际上只有一个任务占用 CPU。所以并发 多个任务的执行时间互相重叠不一定等于真正同时执行。3. 并行多个线程在多个 CPU 核心上真正同时执行时间 → CPU 核心 1射线 0 ─────────────── CPU 核心 2射线 1 ─────────────── CPU 核心 3射线 2 ─────────────── CPU 核心 4射线 3 ───────────────所以并行 多个任务同时执行通常需要多个线程或多个 GPU 执行单元。