iPhone 游戏开发教程 游戏引擎 (3)

ktplayno 2011-07-18

iPhone 游戏开发教程 游戏引擎 (3)是本文要介绍的内容,继续上一章的内容开始介绍,本文主要介绍动画的一些内容,详细内容先来看内容。

动画

通过渲染连续的图片,我们可以确保玩家看到一个移动的物体,尽管他所做的仅仅是在同样的像素上,但这些像素在快速的改变颜色。这就是动画的基本概念。2D动画很简单,但3D动画通常牵扯到更多的物体与动作,因此更复杂。

除了讨论动画技巧,这一节还会讨论主要的优化类型可以使得我们的图像引擎有效的和可靠的完成复杂的不可能以原始方式来完成的图形任务。一些主要的优化技巧包括淘汰、纹理排序、使用智能纹理文件、资源管理和细节级别渲染。

2维动画:精灵

在2D图像中,如果我们要渲染马儿奔驰的完整场景,我们可以先创建出马儿的奔驰各个姿态的图片。这种图片成为一帧。当一帧接一帧的渲染到屏幕上时,马儿动起来了(见图2-7)。这和电影创建动画的方式非常相似,电影也是通过展示连续的帧来达到移动效果。

iPhone 游戏开发教程 游戏引擎 (3)

图2-7 斯坦福德的马的动作

为了将这些帧保存在一起,我们将它们放在同一个纹理中,称为精灵。通过前面章节我们描述的裁剪方法,将只包含当前帧内容的部分渲染到屏幕上。

你可以将每一帧渲染多次直到渲染该序列的下一帧。这取决于你希望你的动画播放的多快,以及提供了多少帧图片。事实上,通过渲染的帧速和顺序,你可以创造出多种特效。

3维动画:模型

与2D动画中每次重画时都维护一幅用来渲染的图片--精灵不同,3D动画是通过实际的计算的计算运动的几何效果。正如我们之前描述的,所有的3D物体都由包含一个或多个三角形构成,被称作网格。有多种可以使网格动起来的方法,这些技术与游戏发展与图形硬件有关。这些技术后的基本概念都是:关键帧。

关键帧与我们之前讨论的2D动画中的帧有些许不同。2维动画的美术人员画出每一帧并保存在纹理中。但是在3D中,只要我们保存了最特殊的几帧,我们就可以通过数学计算得到其他帧。

最开始的使用网格动画的游戏实际上存储了网格的多个拷贝,每一个拷贝都是都在不同的关键帧方向上。例如,如果我们在3D中渲染马儿,我们应该为上面精灵的每一个关键帧都创建网格。在time(1),第一帧被描画出来,在time(2),第二针被描述出来。

在主要关键帧之间,使用一种叫做“插值”的技术方法。因为我们知道time(1)的关键帧和time(2)的关键帧有着相同数量的三角形,但是方向稍有区别,我们可以创建当前时间点的临时的,融合了前面两个网格的网格。所以在时间time(1.5),临时网格看起来正好介于time(1)与time(2)之间,而在time(1.8),看起来更偏向于time(2)。

以上技术效率低下的原因是很明显的。它仅在只有少量的三角形和少量的关键帧时才是可接受的,但是现代图像要求有高解析度与生动细节的动画。幸运的是,有更好的存储关键帧数据的方法。

这就技术叫做“骨骼动画”(skeletal animation, or bone rigging)。还是以马儿为例,你可能注意到了大多数的三角形都是成组的移动,比如头部组、尾部组和四肢组。如果你将它们都看成是骨头关联的,那么将这些骨头组合起来就形成了骨骼。

骨骼是由一组可以适用于网格的骨头组成的。当一组骨骼在不同方向连续的表示出来的时候,就形成了动画。每一帧动画都使用的是相同的网格,但是都会有骨头从前一方位移动到下一个方位的细小的动作变化。

通过仅存储在某一个方位的网格,然后在每一关键帧时都利用它,我们可以创建一个临时的网格并将其渲染到屏幕上。通过在两个关键帧之间插值,我们可以以更小的成本来创建相同的动画。

动画控制器

动画控制器对象在抽象低层次的任务非常有用,如选择哪一帧来渲染,渲染多长时间,决定下一帧代替前一帧等。它也起到连接游戏逻辑与图像引擎等动画相关部分的作用。

在顶层,游戏逻辑只关心将设某些东西,如播放跑动的动画,和设定它的速度为可能应该每秒跑动数个单位距离。控制器对象知道哪个帧序列对应的跑动动画以及这些帧播放的速度,所以,游戏逻辑不必知道这些。

粒子系统

另外一个与动画控制器相似的有用对象是粒子系统管理器。当需要描画高度支离破碎的元素,如火焰、云朵粒子、火苗尾巴等时可以使用粒子系统。虽然粒子系统中的每个对象都有有限的细节与动画,它们组合起来却能形成富有娱乐性的视觉效果。

淘汰

最好的增加每秒钟描画到屏幕上的次数的方法是在每次迭代中都减少描画在屏幕上的数目的总量。你的场景可能同时拥有成百上千的物体,但是如果你只需要描述其中的一小部分,你仍然可以将屏幕渲染得很快。

淘汰是从描画路径上移除不必要的物体。你可以在多层次上同时进行淘汰。例如,在一个高层次,一个用户在一间关闭了门的房间里面是看不到隔壁房间的物体的,所以你不必描画出隔壁其他物体。

在一个低层次,3D图像引擎会经常移除部分你让它们描画的网格。例如,在任意合适的给定时间点,半数的网格几何体在摄影机背面,你从摄像机中看不到这些网格,看到的只是摄影机前方的网格,因此,当网格被渲染时,所有的在摄影机背后的网格都会被忽略。这叫做背面淘汰。

纹理排序

每次当一个物体被渲染到屏幕上时,图形硬件都会将纹理源文件载入到内存中。这是被称作上下文交换(context switching)的一部分。

如果要将三幅图片描画到屏幕上,而其中两幅图片共用同一个纹理资源,有两种办法来处理纹理排序:高效的方法是连续的渲染两幅共享资源的图片,这样只需要以此上下文交换,而低效的方法则需要两次上下文交换。你不应该将第三幅图片放在共享纹理的两幅图片之间描画。

在渲染处理过程中,通过排列共享纹理的物体可以减少上下文交换的次数,从而提高渲染速度。

纹理文件

在一开始就计划好纹理组织结构可以帮助你以最优化方式排列你的纹理。假设你准备在你的游戏中描画几何体,一个主角和一些生物。

如果前两个关卡是草地,接下来的关卡是沙漠,你可以将所有的树木、草、灌木、岩石以及花儿的图片来放到一起来渲染前两关,并将沙子图片放在另外一个纹理文件中用来渲染第三关。同样的,你可以将玩家虚拟人偶放到一个纹理中。如果所有的生物在所有关卡中都用到了,最优的方式可能是将它们放在一个纹理文件中。但是,如果第一关有吼猴与鼯鼠,而第二关只有森林鼠与苏里南蛤蟆,你可以将第一次前两种动物放在一个纹理中,将后两种放在一个纹理中。

资源管理

大部分的视频游戏在一个时间点只会渲染它们所有图片内容的一小部分。将所有纹理同时载入内存是非常低效的。

幸运的是,游戏设计通常决定了哪些资源在游戏的各个章节是可见的。通过保留必须的纹理为载入状态并卸载不使用的纹理,可以最有效的利用有限的内存资源。

还是使用前一节的例子,当游戏引擎载入第一关时,资源管理代码必须确保 吼猴与鼯鼠的纹理被载入到内存中。当程序进行到下一关时,资源管理代码会卸载那些纹理,因为它已经知道它们不会在第二关被使用。

细节层次

另外一个优化技巧,尤其是对3D图像,叫做细节层次。考虑当一个物体远离摄像机时,它看起来非常小,而且大部分细节都丢失了。你可以描画一个同样大小,却仅拥有简单网格的物体,或者甚至一张平面贴图。

通过保留不同细节层次的物体的副本在内存中,图像引擎可以根据与摄像机的距离决定使用哪个副本。

小结:iPhone 游戏开发教程 游戏引擎 (3)的内容介绍完了,希望本文对你有所帮助!想要深入了解iPhone  游戏引擎的更多内容,请参考以下几篇文章:

iPhone 游戏开发教程 游戏引擎 (1)

iPhone 游戏开发教程 游戏引擎 (2)

iPhone 游戏开发教程 游戏引擎 (4)

相关推荐