我们在日常交流,或者从别人口中经常听到引擎(Engine)这个词语.比如搜索引擎,那就是Google,还有walfromAlpha(科学),还有百度了.回来说道游戏这块,某某游戏用了虚幻3(Unreal3)引擎开发的,某某游戏又用了Unity3D引擎,当然还有我们接触的Cocos2D这个引擎.基本在计算机技术里,遍地都是自称引擎的开发工具或框架.
我经常会问自己,引擎这么多,每天还有新的引擎诞生,那心目中真正的”游戏引擎”应该是什么样的,会有怎样强大的功能和性能.
数一边当今的几大主流平台:Windows,Xbox,PS3,PS Vita,3DS,iOS,Android,Mac,游戏可以多个平台发布,市场影响会很好.但是没有跨平台的游戏引擎支持,移植和维护会是一件非常耗费资源的工作,而且不能多个平台同时发布.游戏引擎的跨平台功能,是不可或缺的.现在Unity3D是这方面是非常出色的引擎了.
引用一句话”互联网项目唯快不破,性能是立根之本”,作为一个游戏引擎,没有出色的动画特效表现力,是很难被认可的,所以很多性能指标就被制定出来.最常见就是FPS了,最少不能低于30桢,并且是否稳定.下面具体讨论性能的几个点.
上面讲性能时,”唯快不破”,就是说引擎不好用.比如学习门槛高,需要几个月进行熟悉.或者,容易”出错”,API概念不清导致开发人员容易错误的使用.或者,不能同时修改文件,耦合高,只能串行工作.应该是多人合作,模块并行开发,最后方便的合成任务.这个和多核cpu一样,并行才是解决之道,不用考虑每个core的频率,项目人员编制就好控制.
现在桌面cpu已经最少双核了,主流都是4核了;而移动设备上,iphone4已经双核了,三星等开始使用4核了;充分发挥cpu效能,是引擎提高性能优先考虑的途径.通常引擎中有渲染模块,物理模块,网络通讯模块,资源管理模块,这几大模块能否在各自的线程中工作,耦合度低,需要共享的数据越少,越容易使用和提高效率,bug越少了.
特效,骨骼动画现在普遍用GPU加速解决,一些优秀的物理引擎,比如Bullet,也用cuda加速计算,physicX更是先驱了.移动设备的GPU效能越来越强了,具有代表意义的是PowerVR一系列GPU,广泛用在iOS设备上,已经使用增加到4核了.然后移动设备上普遍使用armv7(Cortex-A8),现在已经支持NEON(同SIMD),同时可以计算4个浮点数,理想情况可以加速4倍啊.所以cpu和gpu的分工希望可以动态调整,算法模块可以根据运行环境在cpu和gpu之间调换.
现在游戏(iOS等移动设备)中经常遇到纹理占用内存超标问题,造成被系统干掉.之前看到一片文章介绍ID Soft(Doom,Quake)使用超大纹理技术(id Tech 5),整个场景只需要一张纹理搞定,这里是一个虚拟纹理(virtual texture)的解决方式,这个用在移动设备上,如果可以解决纹理内存问题,造福大众啊.
Lua确实是门好语言,在游戏开发中很难不发现它(cocos2d-x,生气鸟,还有Warcarft).但开发者对其是又爱又恨,原生没有面向对象,非要像C++那样去OO(云风的吐槽),被用作”胶水代码”. Unity3D使用mono(.Net)做脚本底层,通常使用C#作为脚本,C#是微软DotNet战略中最拿手的语言,吸收各家所长,Unity因此也非常强大.Javascrip借助V8一洗过去作为Web前端语言,在服务器后端(NodeJs)展露头角,MongoDB使用js作为操作接口.原来lua和python性能差不多,但是两者和V8还是差一个等级.游戏引擎中支持JS会是件非常有意思的事,js可以用简短的代码表示一件复杂的事情,这是过程式的语言和C++/C无法做到的.
上面第七点讲到脚本的重要程度,可以更大胆拓展一下:游戏逻辑一次编写,服务器和客户端通用.两者的逻辑都使用脚本编写,基础模块通用,底层做一些适配.如果游戏整个在服务器上,客户端只管理渲染输入,或者渲染都由服务器”包办”了,完全的”云游戏”,这些都很有吸引力,也有很大的挑战性.
先写这么多,以后继续补充了.写得不是很严格,如果有误请指正.