游戏引擎分层简介
游戏引擎分层架构(自上而下)
工具层(Tool Layer)
在一个现代游戏引擎中,我们最先看到的可能不是复杂的代码,而是各种各样的编辑器,利用这些编辑器,我们可以制作设计关卡、角色、动画等游戏内容,这一系列编辑器就构成了引擎最上面的一层——工具层。
功能层(Function Layer)
- 将一个三维虚拟世界转换为一帧一帧的二维图像的过程,我们需要用到渲染系统(Rendering);
- 让一个个静止的模型运动起来,做出惟妙惟肖的动作,形成连续的画面,我们需要用到动画系统(Animation);
- 物理的碰撞,各种力的作用,让物体的运动更贴近真实世界,我们需要用到物理系统(Physics);
- 每一个游戏世界都有着自己的规则,还要有NPC来丰富游戏可玩性,这就需要用到脚本(Script)、状态机(FSM)和AI;
任何一个游戏的操作都离不开人机交互,这其中又涉及一系列功能。以上的种种功能组合在一起便构成了游戏引擎的功能层。
资源层(Resource Layer)
游戏中有的不只是一行行的源代码,还有各种格式的多媒体文件,如PhotoShop的PSD文件、3DSMAX的MAX文件,加载管理这一系列的图形、图像、音频、视频文件以及其他数据,就是资源层的任务了。资源层位于功能层之下,不断为功能层提供数据,这就好像上面是一个画家在画画,而资源层在下面不断为其提供颜料。
核心层(Core Layer)
游戏引擎中最核心,最重要的一层就是核心层。核心层负责响应上面层次频繁的调用,提供各种基础功能,如内存管理、容器的分配、数据的运算、多线程的创建等等。
平台层(Platform Layer)
平台层是最容易被忽略的一层,一款游戏或者引擎可能被发布在不同的平台上,会有不同的图形接口;并且不同的用户可能使用不同的硬件设备,如键鼠和手柄。适应不同的平台,就是平台层的任务。
第三方库(Third Party Libraries)
中间件和第三方库通过SDK(Software Development Kit)的形式或文件格式进行转化。
为什么要分层架构?
为了使游戏引擎解耦并降低复杂度,每一层都将独立完成自己的任务,底层为上层提供基础服务,上层调用底层的工具。这样的分层架构使得上层灵活,底层稳定,更有利于功能的更新和开发。
资源层
Photohop中的PSD文件、3DSMAX中的MAX文件等一般包含工具自带信息,大量与引擎无关的数据,数据格式比较复杂, 直接使用会很大程度上降低效率。为了提高调度资源的效率,需要引擎在导入时将不同资源都转换为资产(assets)文件。例如引擎中使用贴图文件时,我们可能导入JPG、PNG格式的文件,但这两种文件的压缩算法对于GPU来说并不高效,直接在GPU中使用会浪费性能,所以其通常被转换成dds格式再存入显存中。
对于任意一个游戏人物,例如上图的小机器人,可能需要绑定对应的材质、贴图、网格、动画等资源,定义一个Composite asset文件关联这些资源,比如XML文件,并使用GUID(全局唯一标识符)进行标识管理。
实际运行时,游戏还需要用到资产管理器(Runtime Asset Manager),其根据资产的生命周期(Asset Life Cycle)对资产进行管理操作,资产的实时加载卸载、资源的分配、垃圾回收(GC)、延时加载等都包括在其中。
功能层
功能层的使用,使得每过一个tick时间,游戏中的虚拟世界就会前进一步。一个tick时间内,分别执行tickLogic()和tickRender()函数,其中逻辑方面的tickLogic()一般先执行,主要用于模拟游戏世界,包括输入输出的处理、相机视角位置的变换、碰撞的检测等操作;用于绘制世界的tickRender()则依据tickLogic()计算出的各资产的位置情况进行渲染绘制。
功能层非常的复杂庞大,特别是涉及到网络编程时,所以通常需要借助多线程计算。当前主流的多线程是将可以并行计算的任务拆分开来,分别放到多个线程运算,但若有不适用于并行计算的任务,其缺陷便显露出了。在未来,引擎会将每个任务划分为极小的可执行单元,将这一个个原子般的任务分配到多个线程中执行,更加高效的利用资源。
核心层
核心层为上层的所有逻辑提供一个基础,它提供数学库(如矩阵运算)、数据结构和容器(如二叉树)、内存管理等工具。因为引擎的一切都是以效率为核心的,所以在进行数学运算时,可以使用近似运算或者SIMD(单指令多数据流,以同步方式,在同一时间内执行同一条指令)提高运算效率;至于数据结构和容器,编程语言中自带的数据结构可能会出现一些问题,比如C++中的Vector在添加对象时开辟的储存空间会成倍增长,在添加大量对象后,使用的储存空间我们将无法得知,可能会产生内存空洞,而引擎中的数据结构更加方便内存的管理,提高访问效率;引擎的内存管理和操作系统很相似,核心原理可以概括为:尽可能把数据储存在一起,访问时按顺序访问,处理时批量处理
平台层
平台层使得游戏能够兼容如Xbox、Mac、Windows等不同平台,手柄、键鼠等不同设备。平台层通过使用Render Hardware Interface(RHI)来去除不同Graphics API(如DirectX11、DirectX12、OpenGL)之间的差异,使上层无需关心使用不同API可能会带来的问题。
工具层
工具层一般以编辑器的形式(蓝图编辑器、材质编辑器等)呈现,可以使用不同编程语言开发(C++、C#、Html5等),以开发效率优先,它需要使不同使用者能够创造游戏内容。因为很多游戏的数字资产是在不同DCC(Blender、MAYA等)中创建的,所以工具层一般包含导入、导出工具用于导入、导出游戏资源。
相关文章:

游戏引擎分层简介
游戏引擎分层架构(自上而下) 工具层(Tool Layer) 在一个现代游戏引擎中,我们最先看到的可能不是复杂的代码,而是各种各样的编辑器,利用这些编辑器,我们可以制作设计关卡、角色、动画…...

向爬虫而生---Redis 探究篇6<Redis的Bigkey问题介绍>
前言: 随着数据规模的增长,Redis的BigKey问题也开始显现。 BigKey问题主要指的是存储了大量数据的key,这可能给Redis的性能和可用性带来负面影响。当一个key的数据量过大时,会占用宝贵的内存资源,拖慢Redis的响应速度。此外,存储和恢复这些BigKey也会变得困难和耗时,增…...

【开源物联网平台】FastBee认证方式和MQTT主题设计
🌈 个人主页:帐篷Li 🔥 系列专栏:FastBee物联网开源项目 💪🏻 专注于简单,易用,可拓展,低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…...

Ubuntu Qt控制终端运行ros
文章目录 gnome-terminalQt 通过QProcess类Qt 通过system gnome-terminal 在Ubuntu中可以使用man gnome-terminal命令查看gnome-terminal的使用指南,也可在ubuntu manuals查看: NAMEgnome-terminal — 一个终端仿真应用.概要gnome-terminal [-e, --c…...

mysql 性能调优参数配置文件
########################################################################### ## my.cnf for MySQL 8.0.x # ## 本配置参考 https://imysql.com/my-cnf-wizard.html # ## 注意: …...

windows右键新建文件没有txt文本文档怎么办?
我碰到此问题,按照以下方法改了注册表, 重启之后就正常了(没有注销,只是单纯重启)。以下方法来自AI: 如果在注册表的 .txt 路径下没有找到 ShellNew 键,你可以尝试手动创建这个键和所需的值来恢…...

已读不回,我又玻璃心了
最近有点上火,3个询盘给我整我无语了,难道我还没修炼到家?玻璃心又出来作祟了? 客户A急火火的发我一个文件,需求内容ios客户端调整,让我按照需求给找个人处理下,我收到后抓紧时间摇人࿰…...

面试经典150题(105-107)
leetcode 150道题 计划花两个月时候刷完之未完成后转,今天(第2天)完成了3道(105-107)150 105.(191. 位1的个数)题目描述: 编写一个函数,输入是一个无符号整数(以二进制串的形式&am…...

javaWebssh药品进销存信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
一、源码特点 java ssh药品进销存信息管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOM…...

计算机设计大赛 深度学习实现语义分割算法系统 - 机器视觉
文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…...

Linux系统编程(六)高级IO
目录 1. 阻塞和非阻塞 IO 2. IO 多路转接(select、poll、epoll) 3. 存储映射 IO(mmap) 4. 文件锁(fcntl、lockf、flock) 5. 管道实例 - 池类算法 1. 阻塞和非阻塞 IO 阻塞 IO:会等待操作的…...

Python与FPGA——全局二值化
文章目录 前言一、Python全局128二、Python全局均值三、Python全局OTSU四、FPGA全局128总结 前言 为什么要进行图像二值化,rgb图像有三个通道,处理图像的计算量较大,二值化的图像极大的减少了处理图像的计算量。即便从彩色图像转成了二值化图…...

《Docker极简教程》--Docker的高级特性--Docker Compose的使用
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许开发人员通过简单的YAML文件来定义应用程序的服务、网络和卷等资源,并使用单个命令来启动、停止和管理整个应用程序的容器。以下是关于Docker Compose的一些关键信息和优势: 定义…...

tidyverse去除表格中含有NA的行
在tidyverse中,特别是使用dplyr包,去除含有NA的行可以通过filter()函数结合is.na()和any()或all()函数来实现。dplyr是tidyverse的一部分,提供了一系列用于数据操作的函数,使数据处理变得更加简单和直观。 以下是一个简单的例子&…...

开源爬虫技术在金融行业市场分析中的应用与实战解析
一、项目介绍 在当今信息技术飞速发展的时代,数据已成为企业最宝贵的资产之一。特别是在${industry}领域,海量数据的获取和分析对于企业洞察市场趋势、优化产品和服务至关重要。在这样的背景下,爬虫技术应运而生,它能够高效地从互…...

使用SMTP javamail发送邮件
一、SMTP协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。使用javamail编写发送…...

Hello C++ (c++是什么/c++怎么学/c++推荐书籍)
引言 其实C基础语法基本上已经学完,早就想开始写C的博客了,却因为其他各种事情一直没开始。原计划是想讲Linux系统虚拟机安装的,后来考虑了一下还是算了,等Linux学到一定程度再开始相关博客的写作和发表吧。今天写博客想给C开个头…...

最新的前端开发技术(2024年)
关于作者: 还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas࿰…...
GCN 翻译 - 2
2 FAST APROXIMATE CONVOLUTIONS ON GRAPHS 在这一章节,我们为这种特殊的的图基础的神经网络模型f(X, A)提供理论上的支持。我们考虑一个多层的图卷积网络(GCN),它通过以下方式进行层间的传播: 这里,是无…...

HBase 的安装与部署
目录 1 启动 zookeeper2 启动 Hadoop3 HBase 的安装与部署4 HBase 高可用 1 启动 zookeeper [huweihadoop101 ~]$ bin/zk_cluster.sh start2 启动 Hadoop [huweihadoop101 ~]$ bin/hdp_cluster.sh start3 HBase 的安装与部署 (1)将 hbase-2.0.5-bin.tar.…...

236.二叉搜索树的公共祖先
236.二叉树的公共祖先 思路 看到题想的是找到两个点的各自路径利用stack保存,根据路径长度大小将两个stack的值对齐到同一层,之后同时出栈节点,若相同则找到祖先节点。但是效率不高 看了大佬代码,递归思想很难理解。 根据大佬…...

【论文精读】大语言模型融合知识图谱的问答系统研究
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...

LabVIEW高精度天线自动测试系统
LabVIEW高精度天线自动测试系统 系统是一个集成了LabVIEW软件的自动化天线测试平台,提高天线性能测试的精度与效率。系统通过远程控制测试仪表,实现了数据采集、方向图绘制、参数计算等功能,特别适用于对天线辐射特性的精确测量。 在天线的…...

7.3 支付模块 - 创建订单、查询订单、通知
支付模块 - 创建订单、查询订单、通知 文章目录 支付模块 - 创建订单、查询订单、通知一、生成支付二维码1.1 数据模型1.1.1 订单表1.1.2 订单明细表1.1.3 支付交易记录表 1.2 执行流程1.3 Dto1.3.1 AddOrderDto 商品订单1.3.2 PayRecordDto支付交易记录扩展字段1.3.3 雪花算法…...

灵魂指针,教给(一)
欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 一、内存和地址 1.1 内存 在介绍知识之前,先来想一个生活中的小栗子: 假如把你放在一个有100间屋子的酒店…...

Linux 开发工具 yum、git、gdb
目录 一、yum 1、软件包 2、rzsz 3、注意事项 4、查看软件包 5、安装软件 6、卸载软件 二、git操作 1、克隆三板斧 2、第一次使用会出现以下情况: 未配置用户名和邮箱: push后弹出提示 三、gdb使用 1、背景 2、使用方法 例一:…...

Markdown
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中、居左、居右 SmartyPants 创建一个自定义列表 …...

【Oracle】oracle中sql给表新增字段并添加注释说明;mysql新增、修改字段
oracle中sql给表新增字段并添加注释说明 ALTER TABLE 表名 ADD 字段名 类型 COMMENT ON COLUMN 表面.字段名 IS ‘注释内容’ ALTER TABLE GROUP ADD T NUMBER(18) COMMENT ON COLUMN GROUP.T IS ‘ID’ mysql新增、修改字段、已有字段增加默认值 ALTER TABLE 表名 ADD COL…...

【汇总】pytest简易教程
pytest作为python技术栈里面主流、火热的技术,非常有必要好好学一下,因为工作和面试都能用上; 它不仅简单易用,还很强大灵活,重点掌握fixture、parametrize参数化、allure-pytest插件等,这些在后续自动化框…...

openssl调试记录
openssl不能直接解密16进制密文,需要把密文转化成base64格式才能解密 调试记录如下:...