关于游戏引擎结构上的思考

这两年接触了一些比较成熟的商业引擎, 慢慢得思想有所转变

以前总以为, 哪个引擎代码写得好看就牛, 太偏激了

很多商业引擎的代码那叫一个乱~

后来觉得引擎工具很重要, 没有经过成功项目的引擎不是好引擎

现在呢? 当然工具还是很重要, 但另一个很重要的因素是: 制作效率

能不能快速开发, 能不能快速搭建原型, 快速推出, 灵活定制才是一个引擎最有竞争力的地方

这扯得有点虚了, 来点实际的

在学习并抄袭够了各种技术细节后, 开始从另一个角度看待一下引擎开发

之前有说过, 引擎可以看作是一个资源管理器, 它的作用是对资源的创建, 编辑, 整合

那这三个大的方面可以从微观的角度看: 那就是它们都是一些基本元素的组合

拿一个模型来说, 可以拆成网格, 材质, 动画等, 网格可以拆成拓扑, 顶点, 顶点可以拆成位置, 法线, 纹理坐标等, 位置可以拆成float

那么从上层到底层, 其实就像原子构成分子, 分子再构成各种物质......

转成引擎术语, 其实就是基本数据类型构成属性, 属性构成组件, 组件组成实体, 实体组成场景, 再加上各种行为与事件, 成为一个游戏

这里面有三个关键的技术点, 那就是反射, 序列化, 组件模式

这三个技术点成就一个成熟引擎所具备的特征: 资源驱动

反射与序列化方面, C++天生不足, 很多引擎里压根没有系统地去考虑这个

在做功能开发时, 常常会发愁数据怎么保存, 怎么编辑

其实很简单, 做了序列化, 所有资源的格式可以进行统一, 不用为模型写一种模式, 地图写一种格式, 逻辑表格写一种格式了

你需要的只是一个Load和和一个Save而已

而序列化也是依赖反射的, 通过遍历属性去序列化, 就可以摆脱烦人的save/load/version编码了

然后是编辑

编辑是强烈依赖反射的, 做好反射机制, 你的编辑器就成功了80%

不管是场景编辑, 还是材质编辑, 甚至于行为, AI, 逻辑, 其实都可以看成属性编辑

在反射机制的基础上, 做一个PropertyEditor, 那你的编辑器就基本完成了

你再也不用开发一个功能就到面板上加一个控件, 改一下保存/加载的版本号了

到这, 引擎已经有一个很好的底层了, 再就是考虑怎么灵活地去进行游戏开发

组件模式就是为了资源驱动, 一个实体需要什么功能就加一个什么模块

模块的属性通过PropertyEditor去编辑

对于行为, 可以使用脚本去实现相应的组件

从这个角度来着, 脚本也就成了一种可以复用的组件资源

那么下一步就是弄个强大的脚本系统, 来配合反射/序列化/组件模式进行开发

好比UE的UnrealScript, Unity3D的UnityScript(Mono), 都是这种结构

对于组件模式, 一个不可缺少的东西就是Prefab, 或者叫Template

因为你所创建的实体都是各种组件的集合, 每次都去一个个的组装起来很麻烦

所以需要一个模板, 这个模板可以是一个物体, 也可以是多个

这些模板才是传统引擎中的resource的概念, 由它们去实例化出各种实体单位

好了, 有了这些东西后, 剩下的就是美术做内容, 程序写脚本, 策划调数值了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python —— 一个『拉勾网』的小爬虫

本文将展示一个 Python 爬虫,其目标网站是『拉勾网』;题图是其运行的结果,这个爬虫通过指定『关键字』抓取所有相关职位的『任职要求』,过滤条件有『城市』、...

5195
来自专栏养码场

一位资深Java的阿里系公司实战面试经验,套路还是面试官的多

占小狼:一位奋斗在魔都的资深Java开发。去年6月在简书上发第一篇技术文章,已坚持发表76篇技术文章,粉丝数突破4000。

2207
来自专栏圣杰的专栏

eShopOnWeb 知多少

eShopOnWeb是基于ASP.NET Core构建,官方创建这样一个示例项目的目的,我想无非以下几点:

1391
来自专栏HansBug's Lab

【备忘】Idea的那些事

说到Java的IDE,似乎eclipse和Idea是目前的主流。然而,OO的课程组却一直在推荐使用eclipse,于是很多人就这样错过了Idea这样强大的IDE...

4219
来自专栏机器学习算法与Python学习

Python:10篇不可错过的~热文~》》真的很热》》

以下是精选了“ Python开发者” 5月份的10篇 Python 热文。其中有基础知识,项目实战等。 《Python 爬虫建站入门手记(1):环境搭建》 本文...

3213
来自专栏企鹅号快讯

在学习Python的道路上,我们应该如何走好这条路

当你决定入门 Python 时,需要有一个清晰且短期内可实现的目标,比如通过学习找一份初级程序员工作,目标明确后,你需要知道企业对 Python 程序员的技能有...

2627
来自专栏狮乐园

RPC vs REST vs GraphQL

最近2周的时间由于工作不忙,一直在看有关GraphQL的东西,前后端均有涉及,由于我之前做过后端开发,当时实现的接口的大体是符合RPC风格的接口。后来转做了前端...

2492
来自专栏应用案例

独家分享 腾讯大神教你如何学习一门新的编程语言-以Python 为例

学习 Python ,进行 Django 开发也有一年了,小结一下,一年的学习历程。 1. 了解新语言产生的背景 ABC 是专门为非专业程序员设计的一种教学语言...

2136
来自专栏开发与安全

在腾讯实习的那段日子:不要在难受的时候选择 '逃避/离开'

时间过得很快,从2014.6.5入职实习到2015.1.5已经是7个月的时间了,在这边还是学到了很多东西,遇到的人大多数比较nice。中间拿到了留任offer,...

2270
来自专栏微信公众号:Java团长

如何阅读Java源码?

假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃《Core Java》,那样是很难有收获的,尤其是《深入Java虚拟机》这类书,或许别人觉得好,...

4942

扫码关注云+社区