[UE4]UE4是单线程的吗?

并行与串行

  并行是同时在执行,串行是一个接一个地执行

进程与线程

  笼统的说,进程是游戏的一次运行,线程是进程里面分配CPU资源的最小单位

类比

  1、把世界看成一台计算机

  2、世界里面的人可以看成是一个一个的进程

  3、一个人可以分心做很多事情:一边走路一边看手机、一边吃饭一边看电视、一边听歌一边学习

  4、进程跟人一样,生命只有一次

大部分游戏,都是单线程的

  为什么会这样呢?

  一方面,单线程写起来比较容易理解;另一方面,它比较符合计算机最开始的架构,最开始的CPU都是单线程的,一条指令一条指令执行。

单线程程序只能利用多核CPU中的一个核

  

单线程改成多线程的阻力

  1、应用场景不一定适合:瓶颈不在CPU,而是在其他(比如显卡)

  2、多线程程序对开发人员要求比较高:能正确处理数据之间的依赖关系

  3、多线程本身是有额外开销的。

UE4线程

  1、游戏主循环是单线程的,不会有多个线程来执行主循环(接受输入、处理游戏逻辑、渲染、Sleep),因此不在一帧里面做太多的事情,如果要做的事情太多的话,可以拆分成在多帧里面运行,就不会卡住了。

  2、设计思想上,模拟了并行(不会有真正的“同时”),游戏引擎模拟的是现实世界,现实世界是并行的,游戏引擎为了让人容易理解,因此游戏引擎模拟了并行,采用的办法就是每个Actor都有自己的Beginplay和tick事件。在游戏主循环的“处理游戏逻辑”里面,对每个Actor的Tick事件都调用一遍,这一个看起来所有的Actor看起来都是并行的。

  Tick事件是每帧都被调用一次,在60帧率游戏中,每一帧只需要17毫秒,在17毫秒要处理所有actor的Tick事件,一帧所花费的时间太短,在玩家看来就是同时执行的。但实际上并没有真正的同时调用Tick事件。

  假设你有一种超能力,啪一下就能让整个世界的时间静止,这个时候去观察正在运行的游戏,它可能正在停止某一帧上,可能正在处理某个Actor的Tick事件,请注意,这个时候只有一个Actor的Tick事件是被处理的,不会同时有2个的Actor的Tick事件被执行。

  所以说游戏引擎只是模拟了并行,但实际上不是真正的并行。

  3、编译、构建光照、运行时与显卡的交互,可能是多线程的,这个是游戏引擎自身的优化,跟游戏逻辑本身的开发是没有关系的。

  4、用户可以自己创建多线程,不过UE4蓝图并且提供这样的接口,但可以使用C++来做这样的事情,或者也可以使用别人包装好的插件来创建多线程。

 

posted on 2018-12-26 23:52  一粒沙  阅读(2304)  评论(0编辑  收藏  举报