《功夫online》3D引擎开发总结

内容概要
《功夫Online》是我在《仙剑3》之后的一个MMORPG项目,引擎是从头开发的;经历了前期半年的快速搭建架构,基本可用,加上后面2年的不断完善,自认为从渲染效果到运行效率都远超同期基于OGRE的产品。后面的在2009年大热的《龙Online》的技术基础就是这个项目打下的。

【欢迎转载,请注明作者:燕良,原文出处:游戏程序员的自我修养

《功夫online》也公测一段时间了,早就想抽时间写点关于功夫开发的东西,可一直无法静下心,现在终于可以松一口气了。功夫的开发始于2004年6月,至今将近3年啦。《功夫》是我全程参与的第二个大型游戏项目了,抛开运营、市场等外在因素,单就游戏本身来说,我认为这个产品是成功的。

在前几年,完成第一个项目的时候,我就认为一个项目的成功必须包含几个方面:

  1. 产生出高质量的产品;
  2. 在技术上有一定的积累;
  3. 团队有所成长。

就这三个角度来讲,我对功夫项目都还比较满意。功夫这个项目最大的问题就是道路走的太曲折了。功夫的游戏系统先后历经数次大的修改,在最后半年时间更是几乎推翻重来!就是在这半年里,大家表现出了很高的热情,游戏得以今天的面貌,这半年的辛苦是可想而知的!感谢这些与我一起战斗的兄弟们啊。

游戏、项目的话题如果摊开了说,那范围太广了,只谈谈功夫的3D引擎的吧。功夫的3D引擎是在公司成立之初完全从头开始写的。在这之前,有一段时间在家赋闲的时候,已经写了两个原型,都不满意。功夫项目大部分时间都在赶工游戏系统,真正给3D引擎的开发时间只有半年,在项目后期又花了一些时间优化。这套3D引擎开发代号为F3D,它吸收了我之前使用过的3D引擎的优点,并参考了开源引擎OGRE。

F3D的核心系统包括:

  1. 一套简洁的RTTI系统,并支持对象序列化;
  2. 虚拟文件系统;
  3. 对外提供SceneGraph接口,内部使用QuadTree管理大型室外场景;
  4. 单独的后台线程,整个场景都可以异步调入;
  5. SceneGraph与渲染系统分离,可以实现多渲染系统;
  6. 面向美术的材质系统,在运行时将材质定义编译为面向3D API的数据;
  7. Terrain,支持texture splatting;
  8. 动画系统支持顶点动画、骨骼动画,后者支持简单的动作混合;
  9. 支持LOD;
  10. Sky Dome,Sky Box,Sun lens flare,并支持昼夜平滑变化和天气变化;
  11. 资源管理系统,支持引用计数、资源池管理方式;
  12. 2D渲染接口,主要用来渲染界面;
  13. 插件管理,编辑器接口;
  14. 特效系统,支持除粒子系统之外的十余种特效元素,可以组合成丰富的特效;
  15. PostProcess

2005年初第一个完成网络同步的客户端版本:
Cline

在工具方面:

  1. 支持Max导出,包括静态模型,顶点动画,骨骼动画,蒙皮,对Max的材质进行了尽可能的支持;
  2. 编辑器框架使用插件结构,可以将所有编辑器整合为一个完整的游戏内容开发工具,每个编辑器是一个独立的工程,很好的封装了复杂度;
  3. 地形编辑器;
  4. 特效编辑器
  5. 地图编辑器;

2004年第一个可用版本的编辑器抓图:
F3D Editor

下面是我认为比较成功的方面:

  1. 设计思路清楚,尽量使用直接、简单的思路,结果是引擎代码只有十万行出头!
  2. RTTI结合序列化的概念,使得复杂对象的存盘读盘代码都极为简单;
  3. 代码进行了良好的文档化注释,并可以使用Doxygen来生成文档;
  4. 动画系统技术比较成熟,特别是3DS Max导出插件出现的bug很少,文件格式几乎没有改动过;
  5. Terrain系统,采用了texture splatting的技术,证明是正确的选择。最终实现的效果非常精细,贴图容量占用也很小,填充率占用略大;
  6. 特效系统表现力很强,无论是场景元素,还是功夫招式都可以给美术足够的发挥空间,最终的画面效果我很满意,很多特效我的都想像不出是怎么做出来的;
  7. 资源管理系统的池机制,使得第二次地图可能很快(竟然有人说这是BUG,说是内存泄漏,还有人问为什么第一次进入这么慢,唉。。。);
  8. 编辑器很重要,地形编辑器和特效编辑器写的很认真,效果也不错;
  9. 对配置要求低!在经过优化之后,我测试了一下Geforce2 MX 400,游戏还是比较流畅的!

2005年底开发中的客户端画面:
Cline

下面是一些不足的地方:

  1. 引擎提供的接口,对于C++来说还算可以,如果想提供给一种脚本语言,就显得不够干净了;
  2. 代码书写整洁,风格统一;
  3. 在异步资源调入方面,出现几个严重的线程同步问题,显示出这块设计的不足;
  4. 有兄弟质疑序列化的效率,比直接读取整块数据要慢,这是个需要考虑的问题;
  5. 特效的管理上还不够完善,未能象普通动画那样应用fly weight模式;
  6. 2D画图接口在最初实现时对效率考虑不够,后来发现,游戏有上千个控件,不得不再进行优化;
  7. 一开始制作的地形的精度,贴图精度都太高了,后来降低了精度发现效果也不错,而视野可以成倍的增加,这个教训要吸取;
  8. 没有考虑室内渲染技术,如果有机会的话,还是很想做一个室内/室外无缝连接的引擎啊;
  9. 地图编辑器写的不好,使用不方便。

原来设想的很好,一直没时间完成的一些东西:

  1. 多渲染系统――本来计划实现一套Fixed function用于低配置显卡,对于支持Shader Model 2.0的卡单独实现一套渲染系统,结果只做了前者;
  2. 遮挡剪裁如果做了,效率还能再提高;
  3. 计划在基于shader的渲染系统中实现一种室外场景光照模型;
  4. C#接口,这样游戏层可以用C#写,希望开发效率能提高。

做为第一个完全由自己设计的3D引擎,成功的完成了一个大型MMORPG项目,还是略有成就感的。不过,不知道是不是游戏程序员都有重写一切的欲望,如果再有机会,我还是希望能从头设计、实现一个3D引擎。

2006年产品上线时的客户端画面:
Cline