操作系统平台抽象层
游戏的本质其实是一个运行在OS上的App,所以游戏所使用的各种系统支持和系统调用都是基于OS的API函数来完成的。 现在的游戏引擎要求跨平台,一次开发就可以打包发布到Android、IOS、Windows、Mac、Linux等。游戏引擎首先会创建一个平台抽象层,主要包括两个方面:
(1)操作系统系统调用,为游戏引擎提供统一的接口;
(2)是为游戏App打包和发布提供的发布工具和发布环境。
平台抽象层主要提供以下功能:
App支持:创建游戏窗口,游戏App有窗口载体;
事件支持:调用OS的API,获取OS的鼠标、键盘、触摸、重力感应等操作事件;
声音支持:调用OS API播放声音;
文件IO支持:调用OS的文件操作API,提供文件读/写等功能;
平台API调用支持:调用手机相册等;
网络支持:调用OS网络接口进行网络通信;
SDK支持:提供SDK接入机制;
OpenGL支持:提供对平台的OpenGL环境的支持;
这些函数开放统一的接口供上层调用。 在内部,不同的平台有不同的实现。 因此,跨平台游戏引擎有对应的项目和针对不同平台的项目。 游戏打包时,不同平台使用平台Unique App项目进行打包。 有了平台抽象层游戏图片素材,跨平台问题就解决了。 为游戏引擎核心的制作奠定了坚实的基础。
引擎内核层
平台抽象层编写完成后,基于平台抽象层提供的操作系统接口支持构建游戏引擎核心。 游戏引擎核心包括以下主要模块:
主循环:游戏引擎实际上是一个循环。 大致伪代码如下
主循环() {
接收输入并处理它;
迭代游戏场景中元素的更新和处理逻辑;
提交给GPU渲染绘制游戏的一帧;
保持适当的帧速率并在 CPU 空闲时适当睡眠。
渲染管线和Shader:基于OpenGL/DirectX等构建渲染策略和渲染管线,为用户提供Shader开发机制。 渲染策略不同。 一个游戏引擎可能有多种渲染策略(渲染管线),比如前向渲染、延迟渲染,像Unity一样,也有可编程的渲染管线。 基于可编程渲染管线,推出了高清渲染管线和轻量级渲染管线。 每个渲染管线和策略都有对应的Shader机制来配合,为用户做Shader开发提供Shader编写机制。
事件输入:访问OS平台事件,然后将事件发送到特定节点或作为系统事件上报到应用层。
网络模块:游戏开发中的网络是长连接Socket(H5使用websocket)和http协议,所以我们也必须支持这个。 Socket是操作系统提供的API。 只需要通过平台抽象来调用。 我们可以使用 http 来使用一些第三方库来对 http 协议进行编码和解析。
文件IO:向应用层提供一些接口,然后调用平台抽象层的底层文件IO系统调用来完成文件IO服务。
声音模块:向参考层提供一些接口或组件,然后调用平台抽象层发出声音。 实现播放声音文件,支持相应的声音格式,如wav、ogg、mp3等。内置了这些常用声音格式的解码库。
场景管理:游戏引擎基本是基于场景+节点的模型。 将场景中的节点以场景树的形式组织起来开源游戏引擎,然后在此基础上制作矩阵等相关数据结构和代码来管理场景中的各个节点。 物体的位置和其他相关信息。
组件化的开发模式:目前,组件化的开发模式是游戏行业的主流模式。 Unity、Cocos、Laya都采用这种方法。 因此,引擎设计了一套基于组件的开发模型机制,开发了一些通用的组件,比如UI组件或者3D骨骼动画组件。 这些组件可以直接用于游戏参考开发。 同时,还将提供一些粒子特效播放。
物理引擎:在游戏开发中,经常使用物理引擎来模拟真实的物理计算。 目前大部分游戏引擎的物理引擎都内置了第三方,例如:libbullet、PhyX、Box2D等。
客户端脚本:脚本系统基本上是游戏引擎的标准配置。 游戏引擎核心大多基于C++实现,C/C++代码开发相对困难。 为了降低游戏开发的门槛,提高开发效率和速度,一般会提供脚本语言进行开发,需要内置脚本解释器。有些脚本是引擎本身定义的,比如Torque,还有一些内置轻量级开源第三方脚本,如Lua、Python、JavaScript等(Unity内置脚本C#)。 同时,必须导出游戏引擎的接口以供脚本使用。
这些模块开发完成后,游戏引擎的核心就基本完成了,包括底层架构以及提供给用户的开发模型。 提供给用户的开发模型机制直接决定了你的引擎是否好用。 现在主流是基于组件的开发,所以现在很多游戏引擎都提供了基于组件的开发机制。
游戏应用层
游戏引擎核心设计完成后,基本上就可以基于该引擎使用纯代码来开发游戏了。 然而,使用这个游戏引擎核心创建的第一个应用程序不是游戏,而是游戏引擎编辑器应用程序。 基于游戏引擎核心游戏素材,开发了一个类似工具的App,具有用户可以编辑的“游戏”、资源管理、日志管理、属性查看、编辑器扩展、粒子编辑工具等功能。通过这个App,您可以可视化编辑游戏场景、动画、动作、特效等,还可以基于此App编写和开发代码。 这些编辑好的场景和资源会生成资源文件。 运行时,游戏引擎内核将它们作为资源加载并运行。 最后一步是打包和发布。 游戏引擎App还将内置针对不同平台的打包工具,让用户可以通过App直接可视化打包,降低开发难度。 游戏引擎编辑器App开发完成后,即可正式交付给游戏厂商用于开发各类游戏。
为什么引擎厂商开源内核源代码而不开源编辑器?
最后跟大家分享一下游戏引擎行业中一个有趣的现象。 为什么很多游戏引擎开源了游戏引擎核心源代码,但不开源引擎编辑器源代码? 比如Cocos、Laya等。这里分为免费游戏引擎和需要授权的引擎。 Cocos、Laya等免费游戏引擎直接开源引擎内核代码,但没有开源编辑器。 这样做的原因是开源的内核代码可以定制和修改。 引擎底层代码和引擎底层代码。 漏洞。 编辑器不开放,因为大多数游戏都是基于编辑器的。 如果编辑器的源代码开放,一个社区中可能会出现很多不同的分支。 比如cocos-lua社区后来推出了quick-cocos。 -lua社区,使得整个版本的更新迭代失控,存在分裂风险。 对于开发者来说不一定是好事。 商业授权码引擎本身有商业授权的资金门槛,而且还有保密协议开源游戏引擎,相对来说比较好,更容易掌控。
好了,今天的游戏引擎框架设计就跟大家分享到这里了。 制造一台好的发动机确实不容易。 为引擎厂商,尤其是免费引擎厂商点赞。