学习小组学习[20210601期]

参考材料
1. 《Exploring in UE4》多线程机制详解[原理分析]

讨论和总结
对于消耗大的, 复杂的任务不建议使用TaskGraph, 一是因为TaskGraph如果被分配到游戏线程, 就会阻塞整个游戏线程的执行, 二是即使不在那几个有名字的线程上执行, 也可能会影响到游戏的其他逻辑. 比如物理计算相关的任务就是在指定名称的线程上执行的(参考PhysScene_PhysX.cpp). 这种复杂的任务,建议自己继承Runnable创建线程, 或者使用AsynTask系统, AsynTask使用的都是新建的线程池里面的线程, 一般与游戏Tick是无关的. 而对于简单的任务, 或者想比较方便的实现线程的之间的依赖等待关系, 直接扔给TaskGraph就可以了.

疑问:
Q1: 游戏线程上的Task能否分配到不同线程上进行?
A1: 一般游戏事件尽量不要分配到不同线程上, 因为依赖事件较多, 且UE4里边也在处理游戏事件时大量地使用IsInGameThread接口判断当前处理的事件是否在游戏线程上, 否则会引擎崩溃; 从代码设计角度上来看, 这也是正常的, 否则的话需要不断地加锁与解锁, 造成代码的可读性下降.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注