GAMES104 笔记 -引擎架构分层和整体pipeline
目录
现代游戏引擎
什么是游戏引擎
引擎开发的难点
游戏引擎分层
资源层
Importing
关联资产Composite asset
Runtime Asset Manager
功能层
Tick
多核
核心层
高性能计算
数据结构与容器
内存管理
平台层
文件路径
硬件渲染接口
硬件CPU架构
工具层
现代游戏引擎
目前市面上的游戏引擎可分为三种:
- 商业引擎(虚幻,unity,Cry)
- 自研引擎
- 开源引擎
什么是游戏引擎
- 构建虚拟世界的基础技术
- 人类想象力或创意的生产力工具
- 复杂性的艺术
- rendering,我们需要先把角色和场景给渲染出来
- animation,我们需要赋予动画给角色执行不同的操作
- physic,我们需要判断其是否发生物理碰撞等物理信息
- control,需要通过设备输入来执行角色的操作
- Internet,需要进行网络同步
引擎开发的难点
- 游戏世界的细节和画面质量受到硬件的影响,比如算力,带宽的延迟,存储空间等硬件的限制。
- 网络延迟与同步
- Real-time:实时,任何算法若无法在1/30s内完成计算,则视为无效。
- 游戏引擎不仅需要面对程序员,还需要面向游戏内容的制作者,比如提供良好的可视化工具链给artist和designer使用进行二次开发。
- 版本迭代兼容性,就像一架飞机在飞行,我们需要在其飞行期间更换零件并且不妨碍飞机的正常运作。
游戏引擎分层
- 工具层(TOOL LAYER)-UE/UNITY
- 功能层(Function Layer)
工具层只能实现一些资源的编辑,场景渲染,物体是可移动的,绑定animation,NPC互动,物理方面
- 资源层(Resource Layer)
而游戏不仅仅需要代码,我们需要大量的数据和文件,主要是美术,音频和动画。因此游戏引擎中有一层用来加载和管理这些数据和文件,使得工作流与游戏高效运行
- 核心层(Core Layer)
容器的创建,内存分配,或者是多线程的管理等
核心层像是一个工具箱,遇到什么问题就给一套对应的工具让你去处理,需要处理内存管理时核心层给你提供内存管理的工具,需要处理容器分配时核心层给你提供容器分配的工具,需要进行数学运算时核心层提供数学模块的工具。
游戏相关的逻辑管理是建立在核心层的基础上的,因此coer layer是最核心的一层。
- 平台层(Platform Layer)
不同硬件对应的平台也不同(PS\PC\Switch\IOS\Android\VR……),不同硬件的输入方式、渲染接口、功能特性各不相同,引擎有一层需要对不同平台进行处理。
- 至此我们有了平台层,解决了不同平台特性的问题
- 然后我们建立所有功能处理的内核,核心层
- 再建立资源层对资源进行加载和管理
- 接着我们建立功能层来进行与游戏相关的操作
- 最后我们建立工具层将功能层进行的与游戏相关的操作可视化为编辑器出来供使用者们使用
为什么要进行分层
- 通过封装分层让每一层只关注自己的事情来减低复杂度,也就是解耦合;
- 底层提供基础服务;
- 顶层不需要知道底层的具体实现;
- 顶层部分迭代频繁,底层相对稳定;
- 一般只允许顶层调用底层;
资源层
Importing
Resource的文件格式是不同的,以类似maya,max这些格式的文件来说,它们是适合在自己的软件Maya,3DMax打开,如果用引擎来加载这些数据的话是很低效的。贴图可以是 png,或者 jpg 等,他们有自己的压缩算法,如果直接在 GPU 中使用会很费性能,可以将其统一转成 dds 格式进行使用。
因此我们需要将这些resource转换成引擎的高效数据,这一步叫做importing,而转换后的高效数据我们称其为asset。
关联资产Composite asset
现代引擎最核心的观念是数据之间的关联(reference)。
现代游戏引擎中我们希望对每一个资产都设置GUID(唯一识别号),从而避免资产位置改变而导致路径找不到的问题(路径无关性)。
Runtime Asset Manager
现在我们已经加载了角色的resource并import成了引擎的asset,接下来我们需要对这些asset进行实时管理,不能让他一直加载到内存里呀,因此资源层还需要处理运行时的资源加载与卸载。
在Runtime Manager中这些asset各自拥有各自的指向关联在一起。
对于资源的管理需要对以下几个方面进行平衡
- 硬件性能:可以申请多少内存
- 资源回收:回收资源时的耗时
- 资源加载:加载耗时 - 同步异步处理
功能层
Tick
执行一次tick,就是将游戏里的所有模块逐步执行一遍。在现代计算机强大的计算能力基础之上,每隔1/30秒执行一次tick,将游戏的逻辑和绘制跑一遍。
通常Tick分为两个功能:逻辑Tick与渲染Tick。
在游戏中,我们先将游戏场景模拟出来(ticklogic),再进行渲染(tickrender)。
TickLogic一般做的是:
- 读取输入输出
- 计算世界物理信息
- 移动camera,角色和物体
- 碰撞检测等
- 以及各种游戏玩法的事都属于逻辑,比如角色A打到了角色B,因为不管看没看见,A都打到了B并造成了伤害
多核
现代计算机CPU为多核处理,因此引擎根据这一特性进行多线程计算。比如Logic和Render我们分配到不同的线程中执行,甚至再多开一个线程来执行加载。
核心层
高性能计算
在普通的ticklogic和tickrendering里只需要简单的线性代数计算,但是我们仍需要重新写数学库,这是因为游戏引擎是一个实时的东西,因此我们需要高效的计算。
- SIMD:并行化计算,一个ALU处理多个运算。
数据结构与容器
原生语言通常会有自带的数据结构,但其中的实现通常不够高效,并且难以拓展。因此游戏引擎经常会自己实现一些底层数据结构,使得几乎没有内存碎片,而且访问效率高。
内存管理
游戏引擎的内存管理十分接近操作系统。游戏引擎的内存性能瓶颈:
- 内存池(分配器)
- Cache Miss
- 内存对齐
内存管理的目的是为了让计算机更快速的处理:
- 把数据放在一起
- 尽可能按顺序访问数据
- 尽量一起读写数据
平台层
平台层存在的意义是为了让你可以无视平台的区别,把平台的差异度掩盖掉。
文件路径
不同平台的文件路径格式不一样。
硬件渲染接口
对于图形API来说,有OpenGL,DirectX,Vulkan等,需要一个RHI(Render Hardware Interface)封装各个平台的SDK的区别
硬件CPU架构
工具层
工具层的意义是为了让别人使用以地图编辑器为主从而形成的一系列编辑器来帮游戏添加或修改内容。
编辑器能及时的实时在我们的游戏引擎中调整效果,保证我们在引擎编辑中看到的效果和实际游戏运行起来的效果一致,提升开发效率;
工具层的代码量占的比例很多。
GAMES104 笔记 -引擎架构分层和整体pipeline相关推荐
- GAMES104实录 | 引擎架构分层(下) part2
本期为GAMES104<现代游戏引擎:从入门到实践>视频公开课文字实录第7期.本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发. 课程共 ...
- 【Games104-现代游戏引擎0102】引擎架构分层个人笔记
参考资料 <GAMES104-现代游戏引擎:从入门到实践>02.引擎架构分层(bilibili) <Game Engine Architecture>(Third Editio ...
- Games104笔记---LE1--现代游戏引擎导论
目录 前记: 基础理论: 现代游戏引擎 当代一些专业的引擎(中间件) 什么是游戏引擎: 游戏里面复杂的系统 开发者平台 书籍推荐 课程内容: 游戏引擎的基础内容 MVVM: 渲染系统 动画系统 物理系 ...
- Games104笔记---LE6--渲染系统3:游戏中的地形/天空/云渲染
目录 地形几何 高度图: 自适应网格细分 几个原则: 网格细分的方法: 实时变形的地形: 体素化: Marching Cubes算法: 地形着色: 存储内容: 地形纹理采样: 正确的过渡算法: 凹凸/ ...
- Games104笔记---LE4--渲染系统1:渲染基础
目录 游戏引擎渲染的挑战: 渲染流水线: GPU架构: 指令: GPU运算单元: CPU向GPU传输数据: 缓存效率: GPU性能边界: 手机渲染架构: 当代硬件渲染架构: 渲染数据组织: mesh系 ...
- 《游戏引擎架构》笔记一
<游戏引擎架构>该系列的博文部分参考下面的博客: http://raytaylorlin.com/categories/%E6%8A%80%E6%9C%AF/%E6%B8%B8%E6%88 ...
- InnoDB学习笔记一引擎架构及特性
文章目录 一.InnoDB引擎架构 1.1 InnoDB架构图 1.2 InnoDB的一个多线程模型 1.2.1 Master Thread - 核心线程 1.0.x版本之前的Master Threa ...
- 软件架构--架构设计的整体介绍
软件架构--架构设计的整体介绍 1 介绍 1.1 概述 1.2 复杂系统 1.3 架构目标 1.4 架构过程(引用<系统架构:复杂系统的产品设计与开发>) 1.5 系统预测方式 经验 实验 ...
- 声网下一代视频引擎架构探索与实践
为应对愈发多样化的音视频互动场景下的挑战,Agora 开始设计自己的下一代视频处理引擎,在过程中关于引擎架构.性能调优.插件系统设计等方面总结了很多经验,希望与各位音视频领域的爱好者.行业从业者分享. ...
最新文章
- 安卓个人信息界面_LOL手游上架,安卓+IOS安装教程
- 海啸(二维前缀和/二维树状数组)
- vue-cli,webpack安装
- 教你用Java的方式创建一个自己的Tomcat容器
- nullnullProcessing Bitmaps Off the UI Thread 处理来自UI线程的位图
- Selenium自动化测试系列文章汇总
- 279 Perfect Squares 完美平方数
- 国内首家,快手上线千万级QPS QUIC集群
- 前端:分享几个前端素材网站
- framework中phonewindowmanager对power键的处理
- java put方式提交_java – 通过HTTP PUT请求上传文件
- 如何修改第三方DLL文件名
- vue 视频播放插件VideoPlayer
- Messaging——WebSocket
- SQL语句的一个面试题目
- 《C Prime Plus》(第六版) 第03章 编程练习 8 品脱/盎司/大汤勺/茶勺单位换算
- 五十岁后肌肉衰减,力量下降?男性想要恢复力量应该怎么做?
- dB dBm dBw
- 升压、升降压开关电源设计的专用DC-DC控制器芯片 车载,安防,应急电源 详细解析与参数原理
- 【WiFi 7】WiFi 7(802.11be)