工作学习笔记——《Game Engine Architecture》

  这本书有助于了解商业级3d引擎在底层(渲染、动画、物理、内存管理),上层(世界、对象模型、脚本集成),工具层(编辑器、数据驱动、debug支持)的一些常用设计模式、基本原理。作者的观点比较客观,大多是列举一些模式,同时指出它们的优缺点与适用范围。书中的实例也都是Unreal、Quake、Ogre这些业界知名引擎。对我来说一些很少接触的知识点(3d渲染、动画、物理),看了作者精彩的描述、分析,有一种想大呼过瘾的感觉。同时在工具层、上层的一些方面,即使现在我做的是不入流的手机游戏,书中的内容也可以和平时的工作互相印证,得到某些启发。下面记录一些我认为的精华内容。


1.内存管理

  常用的有小内存池(大量小体积对象)、堆栈式(类似关卡这种可以整体分配、整体释放的管理方式),这两种是碎片无关的,速度快,好实现。


2.资源管理

  设计资源管理系统的一些基本要求(例如版本管理;资源移动、改名的话,资源间的引用关系不能被破坏);资源条件管道线(asset conditioning pipline),要能方便的控制资源如何导出(图片色深、对应平台等),对于跨平台大型3d游戏可能比较有用。


3.实时模拟(Real-Time Simulation)

  作者似乎不推荐用帧数来更新游戏世界,而是使用连续时间,例如毫秒数。在动画上,甚至可以插值出任意时间点的动画;时间可放缩、甚至倒流。


4.骨骼动画

  平时工作中使用的都是2d精灵动画(美术用各种小图块拼出一些列动画帧) ,在书中接触到骨骼动画这个概念还是有些震撼。一个静态3d模型可以由一张纹理图映射到一组顶点上渲染得到。这样一组顶点的位置就相当于2d精灵动画中一帧里小图块的位置。一个比较明显的3d动画方式就是给出动画每一帧里所有顶点的位置。甚至可以只给出关键帧的顶点位置,其余帧按插值法得到。更进一步,一般动画中,大量顶点的位置自由度是比较低的,它们可以看成是被某些关节节点所驱动,只要给出这些关节节点的动画位置,就可以插值平均出其他节点的位置。这些关节节点的动画信息,即被称为骨骼动画。书中讨论比较多的是各种骨骼混合方法,尽量使用程序生成各种效果自然的过度动画。


5.对象模型

  书中介绍了两种对象模型:以对象为中心和以属性为中心。以对象为中心的设计很常见,每个游戏对象从属一个类型,每个类型封装了自己的数据和方法。简单的使用这种模式,当类继承体系越来越庞大时,容易导致难以理解、难以维护、分类困难、基类膨胀等各种问题。与一般面向对象设计相同,这个问题的解决之道是分清is-a和as-a,更多使用组合而不是继承。以属性为中心的设计很像高度采用聚合方式的以对象为中心的设计模式。这里每个属性一般是一种具体类型,例如生命值、位置等,它们保有自己的方法,例如移动、生命值改变等。对象视为属性的集合。这种方式的优点有不少,像节约内存(每个对象可以只保留自己实际用到的属性)、更易数据驱动、没有大继承体系等。特别的,这种方式经常以属性列表而不是对象列表的形式存储数据,对于集中对属性读取的操作有更高的缓存命中率,性能上的提升不可小视。这种方式的主要缺点是属性间的互相影响实现起来比较困难,调试也麻烦。


6.数据驱动

  采用数据驱动的方式,给予设计者和美术工作者一些直接创造游戏内容的能力,是当今业界面临越来越庞大的游戏规模所达成的一个共识。当然,我们也不要在这条路上走的太极端,要考虑好实现一套复杂数据驱动引擎的工作量,和它带来的生产力提升相比,是否值得实现。



你可能感兴趣的:(设计模式,游戏,工作,工具,引擎,手机游戏)