[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渲染体系中比较宏观顶层的 ...
随机推荐
- 使用fastjson解析数据后导致顺序改变问题
在开发过程中遇到一个问题,服务器经过排序返回后的字符串数据使用fastjson解析后,数据顺序发生变化,引起业务异常. 解决办法: 1.解析时增加参数不调整顺序 JSONObject responde ...
- python英文与中文的词频统计
1.统计英文单词, # 1.准备utf-8编码的文本文件file(已在文件夹中定义了 一个名叫“head.txt.rtf”文本文件,详情请见截图) def getTxt(): #3对文本预处理(包括) ...
- 【TCP/IP】二、协议的概念
一.概念 1.tcp/ip是通信协议的统称. 2.协议就是计算机与计算机之间通过网络实现通信时,事先达成的一种约定.这种约定,使那些不同厂商的设备,不同的CPU以及不同的操作系统组成的计算机之间,只要 ...
- File file = new File("路径名") 路径名的2种写法
项目的结构:相同颜色是同级的 bean的配置文件的读取和一般文件的读取有点差别的 public static void getValue(String key){ //传入"time&quo ...
- hasura graphql-engine v1.0.0-alpha30 版本新功能介绍
hasura graphql-engine v1.0.0-alpha30 发布了,以下为一些变动的简单说明 破坏性的变动 order_by 中的desc 从 desc nulls last 修改为 d ...
- 5 个关于 API 中日期和时间设计规则
规则 #1 使用ISO-8601格式作为你的日期格式 ISO 8601 解决了很多问题,包括: 自然排序 - 简单和优雅,免去多余的工作即可实现排序 时区偏移 - 代表用户的地点和时区在日益增长的全球 ...
- 我发起了一个 用 C 语言 作为 中间语言 的 编译器 项目 VMBC
大家好 , 我发起了一个 用 C 语言 作为 中间语言 的 编译器 项目 VMBC . VMBC , 全称是 Virtual Machine Base on C . 有一种说法 , C 语言是 ...
- CSS矩形盒子的四个边界
CSS下这些矩形盒子由标准盒模型描述.这个模型描述元素内容占用空间.盒子有四个边界:外边距边界margin edge, 边框边界border edge, 内边距边界padding edge 与 内容边 ...
- gitlab 可以上传代码,但是 不能 上传 tag 问题
原因是 puttygen 生成的 公私钥不能用, 换 git 私钥后 ( 默认不能导入到 pageant ),再用 puttygen 转一次就可以了.
- mysql show master status为空值
问题 执行show master status,输出结果为空: mysql> show master status; Empty set (0.00 sec) 原因 mysql没有开启日志. 查 ...