并行与串行

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

进程与线程

  笼统的说,进程是游戏的一次运行,线程是进程里面分配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++来做这样的事情,或者也可以使用别人包装好的插件来创建多线程。

[UE4]UE4是单线程的吗?的更多相关文章

  1. [UE4]ue4 c++学习推荐

    我由易到难推荐,不过在此之前还是先看看官方对于VS设置的推荐: https://docs.unrealengine.com/latest/INT/Programming/Development/Vis ...

  2. [UE4]UE4中的常见类

    一.Actor:可以放在世界中物体 二.Pawn:可以接受Controller输入的Actor 三.Character:是一个可以行走.跑.跳等行为的Pawn 四.Controller:没有物理表现的 ...

  3. [UE4]ue4 FString 中文乱码问题

    使用FString出现乱码,最简单的情况,FString Str = "你好"; 这时候就会出现乱码,解决方法是改成这样 FString Str = TEXT("你好&q ...

  4. VR/AR 非技术总结

    VR/AR 非技术总结 **欢迎转载~转载请注明Erma的博客 http://www.cnblogs.com/Erma-king/** 都说2016是VR/AR的元年,上半年我随着新技术的潮流进入了V ...

  5. 从Unity引擎过度到Unreal4引擎(最终版)

    原文地址:http://demo.netfoucs.com/u011707076/article/details/44036839 前言 寒假回家到现在已经有十多天了,这些天回家不是睡就是吃....哎 ...

  6. Windows进程间通信(上)

    一.管道 管道(pipe)是用于进程间通信的共享内存区域.创建管道的进程称为管道服务器,而连接到这个管道的进程称为管道客户端.一个进程向管道写入信息,而另外一个进程从管道读取信息. 异步管道是基于字符 ...

  7. UE4中Bebavior Tree中Delay及其后面代码失效的原因

    具体原因是因为节点的执行过程中,该节点及其父节点的Decorator条件不满足,而节点又受到flow control的影响,导致中途强制结束了Task节点的执行,具体如下. UE4中的Behavior ...

  8. 【UE4 C++ 基础知识】<13> 多线程——TaskGraph

    概述 TaskGraph 系统是UE4一套抽象的异步任务处理系统 TaskGraph 可以看作一种"基于任务的并行编程"设计思想下的实现 通过TaskGraph ,可以创建任意多线 ...

  9. 《图解UE4渲染体系》Part 1 多线程渲染

    上回书<Part 0 引擎基础>说到,我们粗略地知道UE4是以哪些类来管理一个游戏场景里的数据的,但这仅仅是我们开始探索UE4渲染体系的一小步. 本回主要介绍UE4渲染体系中比较宏观顶层的 ...

随机推荐

  1. How should I store JSON in redis?

    var redis = require("redis"); var client = redis.createClient(); js = { "like":& ...

  2. hive query with field is json

    if field is json,when query one key from json ,it will help you . select idfa, appid ,appname , coun ...

  3. hasura graphql-engine &&patroni docker-compose 环境运行

    patroni 是一个很不错的pg ha 解决方案,graphql-engine 是一个很好的graphql 工具,为了方便使用 参考patroni官方的文档,使用docker-compose 将应用 ...

  4. 远程连接mysql数据库碰到的问题及解决方案

    直接用SecureCRT登录到我的linux服务器,连接mysql后出现以下错误 然后我用root用户登录到mysql查看了我的用户信息,如下 出现问题1的原因有很多种,我这里是因为用错了yangli ...

  5. wampserver变橙色,apache 服务无法启动!问题解决小记(安装失败亦可参考)

    http://blog.csdn.net/haoaiqian/article/details/58147079 80端口被占用的可能性非常大,关掉IIS即可

  6. 对某个区间操作(sort,stable_sort,parital_sort,parital_sort_copy,nth_element,is_sorted)

    sort //版本一 template <class RandomAccessIterator> void sort(RandomAccessIterator first,RandomAc ...

  7. day 30 1.操作系统原理 2. Process 模块学习

    进程: 起源:进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作 ...

  8. 详解Linux查看实时网卡流量的几种方式(转)

    转自https://www.jb51.net/article/112965.htm 假如Keepalived有10个VIP,怎么查看每个VIP的流量呢? 这里就可以使用sar命令查看网卡流量了.前提是 ...

  9. JCP与JSR

    JCP Java Community Process ,Java社区进程,Java标准指定组织JCP成立于1998年,官网,由社会各界Java组成的社区,规划和领导Java的发展,其成员可以在这里看到 ...

  10. naturalWidth与naturalHeight

    naturalWidth与naturalHeight是HTML5的新属性, 可与通过这两个属性来直接获取图片的原始宽度和高度, 现在在火狐, 谷歌, IE11均已经实现 可以看看naturalWidt ...