跨平台的2D游戏框架之组件预研

最近一直在从事后台相关的工作,组里面也出了很多事情,让人感叹世事无常啊。

废话不多说,回到正题。

自己在工作之余花了一些时间寻找可以跨平台的2D游戏解决方案,看了一些,要么过于重量级、要么收费、要么各种依赖。而使用普及度颇高的cocos2dx也在代码质量上让我对其的印象大打折扣。说起来不管是公司里面也好还是整个业界,很多时候并不在意用的是什么,更在意用什么能最快出产品,然后入市捞一笔钱。因此一些东西烂就烂了,毕竟再难用都是程序在扛着,只要能出东西才不管程序怎么样呢。

又扯远了。

在这样绕了一圈后反而更期望自己去搞一套跨平台的游戏引擎、框架或者解决方案出来。然而这种事情显然不是那么容易的,既然要跨平台,免不了要和平台相关的API打交道,如果有C-style的接口倒也好,但是到了移动端,你就不得不被厂商牵着鼻子走——安卓上就免不了用JAVA,NDK甚至连一些基本功能都要用JNI,而IOS或者OSX,就不得不用ObjectiveC。这里不得不吐槽下OSX,抽了一点时间翻阅了一下Apple的开发者中心,发现OSX上用于渲染的OpenGL有好几套API,什么AGL\CGL\NSOpenGL,也是酷炫的不行。

因此,在缺乏相应平台的开发经验、不清楚有多少坑的情况下,我也不敢轻易做跨平台的尝试,因为很有可能到最后才发现自己的一种设计在某个平台上完全无法实现或者要做大量的wordaround而需要返工。但是即便如此,我也要开始往跨平台这个方向上做一些尝试了。

于是自然而然的,要对使用的组件进行调研。

  • 图形API

图形API上的选择除了OpenGL想来是没有别的了,而且还非得是OpenGL ES 2或者3。自己不太清楚GLES2和3的差异,似乎3的API更好用。

但是GL也有很多麻烦,首先一点,自己完全没用过GL,对它的接口不熟悉。之所以选择GLES除了对未来移动端设备做预先支持以外还考虑到OpenGL本身API的冗杂的问题。

好消息是,在Windows平台上GLES有微软官方做的包装层,能够把GLES调用转换到DX9上(见angle项目);

坏消息是,在OSX平台上并没有相关的项目,不过稍微欣慰的一点是OpenGL的API上面还都是有的,所以不需要太多改动。

  • 图像库

图像库是一个比较头疼的问题,FreeImage应当是一个不错的项目,但是许可有些不太明朗,不清楚是否可用于非开源的项目。

通常情况下,游戏都使用png做纹理格式(不考虑压缩纹理),因此就算别的格式不支持,libpng也是必须的。

  • 文字渲染

文字渲染一直是游戏的痛点,在目前的项目组中,前台把字体分成“美术字”和“程序字”,名字上来看前者就是用素材拼接的、后者则是用字体实时渲染的。

素材拼接的字体一般就是设置一些字模,然后在运行时逐个按需要渲染,这个地方需要一套工具用于生成这样的字体,否则手工录入汉字是非常头疼的事情。

而程序字不存在拼接的问题,但是字形渲染需要CPU进行,并且现在只有FreeType这一个选择。实际使用中FT渲染的字体总是有些不尽人意,据说和一些文字渲染的专利有关。因此如何有效的结合FT又是一个很头疼的问题。

此外,API设计上还要有机的结合这两种渲染方案,将其抽象成一套,再交给底层图形API进行渲染。这也是一个问题。

  • 音频库

音频相关的跨平台库也很少,PortAudio是个不错的选择,但是缺少诸如Pan\Volume一类基本的操作,更底层。大名鼎鼎的FMod在商业化项目上需要收取一定费用,故Pass。最后只有OpenAL可用,而且API还不错,不像DirectSound一样恶心。唯一的缺憾是需要安装专门的Runtime。

  • 音视频解码库

和图像库一样,同样需要音视频的专门的解码库。这也是一个痛点,因为这些格式总是有这样或者那样的专利。音频方面libvorbis/ogg是少不了了,而mp3格式由于缺乏好用的解码器和一竿子专利问题,所以很难使用。

各方面而言,如果能使用ffmpeg那是极好的,可以一并解决音视频解码的问题。但是这里的许可问题不清楚怎么解决,LGPL?

总之,一番调研下来,可以得出一个大概的组件选择:

OpenGLES2+FreeImage(?)+FreeType+OpenAL+FFMpeg

之后,就需要考虑如何将这些东西有效的结合起来了。