一个游戏引擎所应具有的元素

原文:http://www.flipcode.com/archives/Elements_Of_A_Game_Engine.shtml
Introduction (简介)

现在我们来说说你将如何写出一个支持华丽特性的3D引擎。你的引擎需要提供的包括:曲面(curved surfaces)、动态光(dynamic lighting)、体积雾(volumetric fog)、镜面(mirrors)、入口(portals)、天空盒(skyboxes)、顶点Shader(vertex shaders)、粒子系统(particle systems)、静态网格模型(static mesh models)、动画网格模型(animated mesh models)。如果你对上面这些都很熟悉了,你也许急着把这些东西整合到引擎当中。9 h: z( V0 G* m) m6 Z0 i p% a

但是请稍等!在你开始写代码前,你必须先思考一下你将用你的引擎来做什么。通常情况下,你应该想拿来做游戏,但如果你马上就开始写你的引擎,你会死得很惨,到后期你可能会因为要增加新的特效和控制重复编写大量的部分代码,最后很有可能以失败而告终。所以事先思考一下你的引擎设计,会为你节省大量时间和麻烦。你也不要一开始就指望建立一个大的工程,这样你可能也会力不从心,最后不了了之。其实这是一个学习所有东西的办法,从小从起,因为人无完人,所以,你最好是能完成你的项目,那样你会感到很自豪。

 

工具/数据

在开发的时候,你可能会需要一些数据,但不幸的是,如果用txt文件来定义一个立方体,是一件非常不容易的事情。所以,至少你得要一个3D建模软件(3d model editors),关卡编辑器( level editors)和图形程序(graphics programs)。这些东西都可以买到,但你也可以在网上找一些免费的。但更不幸的是,你有可能会需要更多网上没有的工具,所以,就需要你自已写了。如果你在网上找不到你想要的关卡编辑器时,你就需要自已写一个了。你还需要写一些代码来打包你的文件。因为要面对成百上千的文件是一件痛苦的事情。你还需要写转换器或是插件来将你3D建模软件导出的文件格式转换成你自已的。你还需要一些其它工具来处理你的游戏数据,比如能见度分析,光照贴图等。: j; O1 }1 }3 |) _2 K. L

有一个基本规律,那就是有可能你写工具的时间,可能比和写游戏花同样多的时间,或者说更多。前期你可以找你想要的工具和文件格式来用,但是总有一天你会意识到,对于你的引擎来说那些东西太普通了,于是你会意无反顾地写你自已的专用版本。

虽然使用现成的东西已经成习惯,但你应该注重你的代码质量。因为也许有一天有人想要使用,扩展或是修改你的工具。特别是如果你将要把你的引擎发布成开源,或是可以让人随意修改的时候,你更应该注意。( j3 R. T+ `' w9 _8 o
% x# Z) ^  K+ g
有可能你会花时间去做图形,关卡,声音,音乐和模型,工作量也和你写游戏,工具,引擎差不多。

系统是你的引擎和机器交互的部分,如果一个引擎写得非常好的话,那么将它从一个平台移殖到另一个平台,应该只会改动与系统相关的部分。系统包含了许多子系统,其中包括图形,输入,声音,定时器和配置。主系统负责初始化,更新和关闭这些子系统。( z v+ W4 v3 K; q$ v" B

图形子系统:它是一个非常直观的子系统,它就负责把东西显示到屏幕上。许多人都采有OPENGL,D3D,Glide或是软渲染等图形API来实现。但如果做得更好的话,你应该实现多种图形API的接口并在它们上面设置一个图形层,这样用户可以有多种选择,也提高了性能和兼容性。这个东西会有一点难度,特别是因为不是所有的图形API都拥有同样的结构。。。

输入子系统:它将获取所有的输入(Keyboard, Mouse, Gamepad and Joystick)并统一进行相应的控制。例如:在游戏逻辑中,用户希望向前移动他的位置。比起逐个检测输入类型并处理来讲,更好的做法是调用子系统,由子系统完成透明的设备检测过程。用户与玩家可以非常自由地切换输入装置,这样玩家就可以很容易地通过不同的输入装置来获取同一行为。

声音子系统:它负责载入、播放声音。该子系统功能非常简洁明了,但当前很多游戏都支持3D声音,实现起来会稍许复杂一些。1 e9 Z  F8 @8 C. R% m7 Q% T

3D 游戏引擎中很多出色的表现都是基于“时间系统”的。因此你需要一段时间来好好构思一下这个系统。即使它非常的简单,(游戏里)基本上所有东西都是通过时间触发来做移动变化,所以,如果你设计得比较好的话,就可以少写很多冗余代码。4 ~3 j  l" z/ I- ^# c

配置系统:位于所有子系统的顶端。它负责读取配置文件,命令行参数, 或是实现修改设置(setup)。在系统初始化以及运行期间,所有子系统都将一直与它保持通讯。比如:切换图象分辩率(resolution),色深 (color depth),绑定按键(key bindings),声音支持选项(sound support options),载入游戏等。这个系统将这些实现显得格外的简单和方便。如果你的引擎支持配置系统,那这调试和测试就方便多了,玩家与 用户也可以方便地选择他(她)们喜欢的运行方式。

控制台
我知道所有人都乐意去跟风做一个象Quake那样的控制台系统。但这的确是一个非常好的想法。通过命令行变量与函数,你就能够在运行时改变你的游戏或是引擎的设置,而不需要重启。开发期间输出调试信息也非常的有效。很多时间你都需要测试一系列变量的值,将这些值输出到控制台上要比 运行一个debugger速度显然要快得多。你的引擎在运行期间,一旦发现了一个错误,你不必立即退出程序。通过控制台,你可以做些非常灵活的控制,并将 这个错误信息打印出来。假如你不希望你的最终用户看见或是使用该控制台,你可以非常方便地将其隐藏,有人看得见就奇怪了。  ^2 l @8 H, d3 }: A

支持系统% `9 w1 m3 q; Q; F# ^. p' Z, U
   这个系统在你引擎中到处都在用。它包含了你引擎中所有的数学成分(点,面,矩阵等),(内)存储管理器,文件载入器,数据容器(假如你不愿自己写,也可以使用STL)。该模块任务针对于基础和底层,你也可以将它复用到其它相关项目中去。

渲染器/引擎内核
是的,每个人都喜欢渲染3D图形。但是渲染一个3D世界有太多不同方法,那想要描述清楚所有图形管线工作的情况实在是太难了。

所以,暂时不管你如何实现渲染器吧,最重要的事情是让你的渲染器组件建立起来,并保持清析的结构。确保你的模块界线分明(不要把这个模块的放到哪个模块了,要放对哦)。我试着将渲染器拆分为以下几个部份:可见性(Visibility)、碰撞检测与反馈 (Collision Detection and Response)、摄像机(Camera)、静态模型(Static Geometry)、动态模型(Dynamic Geometry)、粒子系统(Particle Systems)、公告板(Billboarding)、网格(Meshes)、天空盒(Skybox)、光线(Lighting)、雾 (Fogging)、顶点SHADER(Vertex Shading)和输出(Output)。( Z6 z" n( o4 E5 g ]
) e4 \6 Y$ E, X2 }
所有的这些子模块都需要一个接口,用来更改它的设置,位置,朝向以及其它的一些与系统相关的设置

设计这个子系统的时候,主要克服的困难就是防止特性膨胀,因此,你应该在设计期间决定你想要实现什么样的特性。如果到最后你发现你不得不新增加特性的话,那说明你先前的设计很烂。

一个好而方便的事情就是你将所有的三角面最终提交给渲染管线中同样的点。(不是同一时间一个三角形,我是说三角形构成的方式 lists, fans, strips等等)多花一些时间让所有物体的具有同一格式,这样它们就都能使用相同的光照计算、雾、以及填充代码。但是到最后你会很高兴,因为这样你就能非常便利地仅通过切换材质与纹理id就使任何多边形具有不同的渲染效果。" h1 t6 g9 P3 J w

这不会对具有多种点的物体绘制造成影响,但是一旦你不当心,它可能会导致大量的冗余代码。7 n# [ b4 I, S4 u1 I. n3 V
/ A# m) a# H2 a: M" T* Q1 l# G
你最后会发现,当你实现所有这些NB的效果后,你的工作才做了15%或更少。这是就对了,图形效果在一个游戏引擎中的比重不大。

游戏接口- Z9 E4 `, b9 u+ ^
1 X) P W; E* _2 q' j5 f
一个3D游戏引擎最重要的就是它是一个游戏引擎,不是游戏。具体的游戏中的组件将不会被放到游戏引擎中去。在游戏引擎与游戏之间有一些薄薄的层(接口)。这样能够保持引擎的结构清析,也能让引擎能够便于使用。这是一些额外的代码,但是它使游戏引擎能够被复用并且可以使用脚本语言轻松地控制游戏逻辑,或者把游戏代码放到一个库中。如果你嵌入你的游戏逻辑到你的引擎中,那你以后想复用的时候,就不要幻想可以直接用了。

我想到现在你最迷惑的应该就是介于游戏和引擎之间的那层接口提供了些什么。答案是:控制。引擎的任何部分都有一些动态属性,因此,游戏/引擎层便是用来修改这些属性的一组相关接口。这些属性包括了摄相机,模型属性,光源,粒子系统,物理,播放声音,播放音乐,处理输入,更改关卡,碰撞检测和反应,移动一个2D图片到头上显示,屏幕标记等等。基本上,如果你想要你的游戏能够做这些事情,你的引擎就需要提供一个接口来让游戏逻辑使用。

  b
游戏% y7 l+ E+ b4 K2 I* L
6 [6 L# f" }! K; F
这里,我无法告诉你如何去写你的游戏。这该轮到你了。如果你已经为你那令人赞异的引擎设计出了一套出色的接口的话,我想你在编写游戏过程中一定会少很多麻烦。9 s W2 D: b3 v3 f. b) f
: p+ A4 S3 W- ]
3D游戏引擎设计是一项巨大的软件工程。一个人也能写出一个游戏,但这不只是熬一两个晚上便能搞定的,你很可能会出写出几兆的源代码量。如果你没有持久的信念与激情,你早晚会放弃。4 y4 g# c. p7 ~$ h1 P+ R+ v
5 S6 q, Z; \! _; `1 o$ I
当然,别指望你的第一次尝试就能写出完整的引擎,选择一个对引擎需求较小的项目。努力,你就能成功。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2010/04/26/1940505.html

时间: 2024-11-06 16:37:23

一个游戏引擎所应具有的元素的相关文章

【IOS(译)】游戏引擎剖析

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/406.html 为了解决"如何在IPHONE上创建一个游戏"这个大问题,我们需要首先解决诸如"如何显示图像"与"如何播放声音"等一系列小问题.这些问题关系到创建部分游戏引擎.就像人类的身体一样,游戏引擎的每个部分虽然不同,但是却都不可或缺.因此,首先从游戏引擎剖

HTML5游戏引擎深度测评

最近看到网上一篇文章,标题叫做<2016年 最火的 15 款 HTML5 游戏引擎>.目前针对HTML5游戏的解决方案已经非常多,但谁好谁差却没有对比性资料.特意花了几天时间,针对文章中出现的12款免费开源引擎做了一次相对完整的对比分析,希望能对大家有所帮助. 针对技术类产品对比,通常有多个维度进行对比,不仅仅是技术层面,还有许多非技术层面的内容会影响我们的使用结果.本文从如下几个维度进行多重对比. 2D与3D 编程语言 设计理念&功能 工作流 性能 学习资料 商业应用 2D与3D.编

J2ME手机游戏引擎程序架构

在游戏开发以及任何软件的设计都需要建立一个稳定的引擎结构体,来作为软件设计的基本架构,是软件体系结构的核心支撑框架,一切功能的实现以及扩展都在这个基础架构之上来完成.一个游戏的设计涉及到游戏控制.角色.游戏场景.道具.游戏声效以及游戏过程事件监听机制等元素,因此建立良好的游戏引擎能对以上各元素进行有效的控制.本文介绍在J2ME游戏设计中游戏引擎的基本程序架构. 游戏引擎可以建立不同的结构体来实现,但是任何游戏的设计都离不开通过设计一个主循环loop来重复控制整个游戏过程,当然整个游戏的核心结构(

一个游戏程序员的学习资料

转自:http://software.intel.com/zh-cn/blogs/2012/03/20/400010004/?cid=sw:prccsdn2194 想起写这篇文章是在看侯杰先生的<深入浅出MFC>时, 突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序 员的书单与源代码参考.一则是作为自己今后两年学习目标的备忘录,二来没准对别人也有点参考价值.我的原则是只写自己研究过或准备研究的资料,所以内容无 疑会带上强烈的个人喜好色彩, 比如对网

私卖公司游戏引擎程序获利10万被判刑

本报讯(高新法检 记者牛莉)一名侵犯著作权获利10万元的技术员,日前被成都高新法院判刑并处罚金. 23 岁的刘某曾担任成都某信息技术公司的技术员,私自复制了该公司拥有著作权的一个游戏引擎程序及两款网络游戏软件,并将其存放于自己的笔记本电脑.公司曾专门叮嘱他,涉及到公司 版权的软件.程序等一定不要在外传播.转卖.刘某辞职后,没有将存放在电脑中的程序.游戏软件等自行删除,还将其复制成光碟后挂在网上公开出售,将该引擎程序以10万元的价格卖给了高某. 法院审理认为,刘某以营利为目的,未经著作权人许可,复

Top 10:HTML5、JavaScript 3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

阿里自主研发的互动游戏引擎Hilo开源啦!【内有详解】

目前,Hilo已经开源,并入到Hilo Team中.开源地址 https://github.com/hiloteam/Hilo (欢迎Star) Hilo的特点: 极简内核: Hilo核心模块极精简,保留了2D游戏引擎最必要的模块,同时采用模块化管理. 完善接入&扩展: Hilo 支持多种模块范式的包装版本,包括AMD,CMD,Standalone多种方式接入.另外,你可以新增和扩展需要的模块和类型. 多种渲染方式:提供DOM,Canvas,Flash,WebGL等多种渲染方案,可以做到跨全端,

j2me游戏引擎的基本构成

游戏引擎在国内还是有一批人走在前沿的,但出于种种的原因发展的并不是很好,并且引擎的神秘面纱和不可揣测的高难度使一些人还没有正式开始就已经打了退堂鼓.通常我们说游戏引擎的时候总是想到3D游戏引擎,的确游戏引擎发展到今天将它发挥到极致的正是3D引擎,但在3D引擎之前其实还是有很多2D,2.5D游戏引擎的,它们现在虽然看起来很弱,但却为3D引擎的产生提供了巨大的理论支持. 原理上讲引擎的结构真的很简单,并没有大多数人想的那么复杂.本篇文章不会讲更复杂的引擎,仅仅针对j2me来讲,但麻雀虽小五脏俱全,我

技术干货分享:如何选择 HTML5 游戏引擎

原生手游市场已是红海,腾讯.网易等寡头独霸天下,H5游戏市场或将成为下一个风口.据笔者所知,很多H5游戏开发团队由于选择引擎不慎导致项目甚至团队夭折.如何选择适合团队和项目的引擎,笔者通过学习和项目实践,总结微薄经验,供大家参考,非技术人员也可以将本篇内容作为引擎选择的重要关注点. 选择H5游戏引擎的思考维度 1.开发语言的支持 2.2D.3D.VR的支持 3.性能 4.引擎的应用广度 5.设计理念 6.工作流支持力度 7.商业化成熟案例 8.学习资源与技术支持能力 首先,我们要知道,当前主流的