818这些年我所遭遇过的游戏中间件
生活中总有些之前从没想过的东西,却出现在自己以后的生活中.比如,上中学时我从没想过自己能上大学.在学校时多次路过一家公司,看它的大楼很是个性,从没想过自己毕业后会坑在这家公司.第一次听说中间件,是我读研时的一个舍友,他的研究方向就是中间件.我问他什么是中间件,他滔滔不绝地讲了一大坨我听不懂也记不住的话.没想到我工作之后却和中间件有着难解之缘.什么是中间件,百度上的解释如下:
"中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。"
上述语句我也看不懂,因为这不是我所搞的中间件,大概是我那舍友所搞的中间件吧.还有另外一种中间件,百度上的定义如下:"中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。"这个定义意思上大概差不多有那么点合乎我的理解.我对中间件的定义是:为编程中某一功能提供具体实现的软件开发工具包.中间件和SDK差不多是一个东西."软件开发工具包(Software Development Kit, SDK)一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等创建应用软件的开发工具的集合." 它或许只是简单的为某个程序设计语言提供应用程序接口的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。一般的工具包括用于调试和其他用途的实用工具。SDK还经常包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。
中间件是由第三方为实现某一功能开发的,较为成熟并且可复用的lib库或dll库.开发者可以通过其提供的接口来实现其功能.中间件所实现的功能有多有少,其复杂程度有大有小.复杂的如一些游戏引擎:osg,ogre.简单的如一些图像格式解析的库,jpglib,pnglib.其特点就是可以嵌入其他的程序中.之所以定义它为中间件是因为,它不是具体的执行程序,无法执行,但它为具体的执行程序提供服务.好吧,按照我的定义,中间件和软件开发工具包就是一个东西.通常我们将一些比较低层的东西叫做软件开发工具包,如openGL,D3D,openCL,也会把一些功能全面又复杂的东西叫软件开发工具包,如:VTK,ogre,osg.而中间件则多指功能具体而且单一的东西,如:用于物理的Havok,PhysX,Bullet,用于界面的Scaleform,用于人工智能寻路的Kynapse,Navigation.
这种中间件并不是处于操作系统与应用软件的中间,而是处于开发环境与开发程序之间.如果要问"STL算中间件吗?",我更倾向于它属于开发环境的一部分.但如果你又写了一套STL,并发布出去,这就算是中间件了.
你若是问我:"中间件靠谱吗?",我会毫不犹豫地回答:"靠".一方面,中间件为开发者提供现成的功能,我们可以简单调用其接口实现一些很复杂的算法.但另一方面,中间件大多不开源,开源的又大多看不懂,一旦出有问题或有了新需求将很难维护.总之,中间件在降低开发成本的同时,会提高维护成本.你可能只需要花几星期或是几天写出一个看上去很有技术含量的DEMO,但当将这个DEMO移植到具体的游戏中时,总会出现这样那样的问题.Shit often happens.几乎所有我遭遇过的中间件都会有奇葩的事情出现.而这些出现问题中,大约三分之一能得到完善解决,有三分之一可以通过别的方式绕过去,剩下的就只能将就着用吧.有时会发现某款中间件就如同鸡肋,欲罢不能,欲进无力.然而有些东西我们只能用中间件来解决,例如物理,这个要独立开发的话,坑实在是太大了.
下面的将所有我遭遇过的游戏中间件列举出来,打算将对每一款都写个小文章,记录下自己的亲身经历.
(1)VTK:一款图形开发包.http://www.cnblogs.com/WhyEngine/p/3473713.html
(2)Havok:物理中间件.http://www.cnblogs.com/WhyEngine/p/3469600.html
(3)Speedtree:用于场景植被渲染的中间件.http://www.cnblogs.com/WhyEngine/p/3504198.html
(4)Physx:物理中间件.http://www.cnblogs.com/WhyEngine/p/3474035.html
(5)Scaleform:用于Flash界面的中间件.http://www.cnblogs.com/WhyEngine/p/3489953.html
(6)FlashOcx:Adobe提供的Flash界面插件.http://www.cnblogs.com/WhyEngine/p/3491132.html
(7)Kynapse:用于人工智能的中间件.http://www.cnblogs.com/WhyEngine/p/3494743.html
(8)HumanIK:用于反向动力学的中间件.http://www.cnblogs.com/WhyEngine/p/3504189.html
(9)Substance Redux:用于纹理压缩与合成的中间件.http://www.cnblogs.com/WhyEngine/p/3484408.html
(10)dxtlib:用于DXT格式转化,DDS文件生成的开发包.http://www.cnblogs.com/WhyEngine/p/3504197.html
(11)Apex:对PhysX的扩展中间件.http://www.cnblogs.com/WhyEngine/p/3474313.html
(12)Bullet:物理中间件.这个由于还没有将它用于具体的项目,而且这是一个开源的中间件尚未进行太深入的研究,所以还没写.先提供个我用Bullet写的Demo:http://www.cnblogs.com/WhyEngine/p/3428311.html
(13)MaxSDK: 3D Max的开发包.http://www.cnblogs.com/WhyEngine/p/3541698.html