[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++来做这样的事情,或者也可以使用别人包装好的插件来创建多线程。
[UE4]UE4是单线程的吗?的更多相关文章
- [UE4]ue4 c++学习推荐
我由易到难推荐,不过在此之前还是先看看官方对于VS设置的推荐: https://docs.unrealengine.com/latest/INT/Programming/Development/Vis ...
- [UE4]UE4中的常见类
一.Actor:可以放在世界中物体 二.Pawn:可以接受Controller输入的Actor 三.Character:是一个可以行走.跑.跳等行为的Pawn 四.Controller:没有物理表现的 ...
- [UE4]ue4 FString 中文乱码问题
使用FString出现乱码,最简单的情况,FString Str = "你好"; 这时候就会出现乱码,解决方法是改成这样 FString Str = TEXT("你好&q ...
- VR/AR 非技术总结
VR/AR 非技术总结 **欢迎转载~转载请注明Erma的博客 http://www.cnblogs.com/Erma-king/** 都说2016是VR/AR的元年,上半年我随着新技术的潮流进入了V ...
- 从Unity引擎过度到Unreal4引擎(最终版)
原文地址:http://demo.netfoucs.com/u011707076/article/details/44036839 前言 寒假回家到现在已经有十多天了,这些天回家不是睡就是吃....哎 ...
- Windows进程间通信(上)
一.管道 管道(pipe)是用于进程间通信的共享内存区域.创建管道的进程称为管道服务器,而连接到这个管道的进程称为管道客户端.一个进程向管道写入信息,而另外一个进程从管道读取信息. 异步管道是基于字符 ...
- UE4中Bebavior Tree中Delay及其后面代码失效的原因
具体原因是因为节点的执行过程中,该节点及其父节点的Decorator条件不满足,而节点又受到flow control的影响,导致中途强制结束了Task节点的执行,具体如下. UE4中的Behavior ...
- 【UE4 C++ 基础知识】<13> 多线程——TaskGraph
概述 TaskGraph 系统是UE4一套抽象的异步任务处理系统 TaskGraph 可以看作一种"基于任务的并行编程"设计思想下的实现 通过TaskGraph ,可以创建任意多线 ...
- 《图解UE4渲染体系》Part 1 多线程渲染
上回书<Part 0 引擎基础>说到,我们粗略地知道UE4是以哪些类来管理一个游戏场景里的数据的,但这仅仅是我们开始探索UE4渲染体系的一小步. 本回主要介绍UE4渲染体系中比较宏观顶层的 ...
随机推荐
- How should I store JSON in redis?
var redis = require("redis"); var client = redis.createClient(); js = { "like":& ...
- 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 ...
- hasura graphql-engine &&patroni docker-compose 环境运行
patroni 是一个很不错的pg ha 解决方案,graphql-engine 是一个很好的graphql 工具,为了方便使用 参考patroni官方的文档,使用docker-compose 将应用 ...
- 远程连接mysql数据库碰到的问题及解决方案
直接用SecureCRT登录到我的linux服务器,连接mysql后出现以下错误 然后我用root用户登录到mysql查看了我的用户信息,如下 出现问题1的原因有很多种,我这里是因为用错了yangli ...
- wampserver变橙色,apache 服务无法启动!问题解决小记(安装失败亦可参考)
http://blog.csdn.net/haoaiqian/article/details/58147079 80端口被占用的可能性非常大,关掉IIS即可
- 对某个区间操作(sort,stable_sort,parital_sort,parital_sort_copy,nth_element,is_sorted)
sort //版本一 template <class RandomAccessIterator> void sort(RandomAccessIterator first,RandomAc ...
- day 30 1.操作系统原理 2. Process 模块学习
进程: 起源:进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作 ...
- 详解Linux查看实时网卡流量的几种方式(转)
转自https://www.jb51.net/article/112965.htm 假如Keepalived有10个VIP,怎么查看每个VIP的流量呢? 这里就可以使用sar命令查看网卡流量了.前提是 ...
- JCP与JSR
JCP Java Community Process ,Java社区进程,Java标准指定组织JCP成立于1998年,官网,由社会各界Java组成的社区,规划和领导Java的发展,其成员可以在这里看到 ...
- naturalWidth与naturalHeight
naturalWidth与naturalHeight是HTML5的新属性, 可与通过这两个属性来直接获取图片的原始宽度和高度, 现在在火狐, 谷歌, IE11均已经实现 可以看看naturalWidt ...