说说我在手机游戏行业这两年

Tue Jun 15 07:32:00 UTC 2010

已经在新公司工作一个月了,每天写写ruby真是一件很快乐的事啊,不用等着漫长的编译时间,不用开着调试器慢性自杀真是一件很惬意的事。最近想来有点奇怪,好象游戏程序员与非游戏程序员之间平时交流的实在是不多,两者的关注点,交流圈,阅读书目与业界偶像都大大的不同,所以有必要谈一谈这两年来一点点观察与想法,以供可能有兴趣加入手机游戏业的同学一点点参考。因为我已经算是离开游戏业,所以有些想法一定会很主观,因为这仅仅是我的一点点观察与想法而已。

在说正事之前先扯扯淡淡(事后发现扯得太长,没兴趣的点这儿 看正题)吧,首先我不是一个硬派的游戏玩家,但还是有一段沉迷玩游戏之中的青葱岁月,大学时迷恋于仙剑,曾经一遍一遍的为了尝试那个谣传的另一结局,在迷宫中来回拼杀,创下了八小时打穿仙剑的记录(当然是用改的,一开始改出乾坤一抛,然后每次R即可,主要是迷宫太费劲了)。后来一发不可收拾,打完了我当时能找到的任何RPG游戏,包括《剑侠情缘2》与《风云天下会》,不过始终没有再也没能找到仙剑给我的感动,也就再也不动RPG,连暗黑都懒得尝试了。在早就烦腻了《红警》儍逼的坦克大战之后,偶然遇到了《帝国时代》,精美的画质与动感的音乐让我立刻爱上了它,从此它成为了我最爱的游戏,常常呼朋换友一起群P,单挑。后来也常常与几个死党打打《大富翁4》、《quake2》、《英雄无敌3》《三角洲》体会一下与人斗的无限乐趣。但是帝国,尤其是帝国2依然是我最爱的游戏,曾经花过不少时间来看战报,研究录像,上game zone与浩方,实战演练开局,也从中享受到无穷的乐趣。后来因为微软的不进取帝国3实在是太弱智,与玩帝国的人本来就比较小众,熟悉的战友日渐稀少,也渐渐的不再玩了。因为实在不喜欢星际的画面,以及与魔兽争霸玩众的疏离,也就再也没有玩过任何即时战略的游戏了。后来风起的网游,可能也是与玩家心理上的隔离,我是没有玩过,只有魔兽世界让我着迷了一段时间,只是发现太花时间,也就渐渐的不再玩了。至于小游戏,我也后来玩一下PopCap的几个经典的休闲游戏。最近也只偶尔玩一下数独来保护大脑的清醒。那种迷恋游戏的岁月与我越行越远,与那些从小伴着红白机,Gameboy一起长大,或又现在XBox,PS,NDS, PSP, Wii等设备一应俱全的玩家们,我只能感叹,我似乎从来没有真正的融入到video game的时代中来过。

不过话说回来,虽然事后想想,我曾经在游戏上消磨了太多的时间,但也是因为游戏,让我明白了DOS上的HIMEM与EMM386的设置,也从用FPE改游戏的过程中领悟了16进制,以及计算机程序的组成无非只是一些0101从磁盘跑到内存中被执行,也从中找到了一点点关于计算机的兴趣,然后才有机会能最终从事程序员这个前途的职业的。我是在高三毕业后那个不堪的回首的暑假中,第一次就是在我父亲科室的机房里接触到电脑的,那里的电脑看着还是很神秘,在一个大大装着空调的房间里放着两台电脑与一台针式的打印机,电脑应该一台是8086,一台是386,用着5寸盘与3寸盘保存着公司所有的重要资料,外人是不允许进去的,那时我们那儿被认为最牛的人现在看来只是一个数据库管理员,他掌管着公司上千号人的档案与工资资料的数据库,而真正教我使用电脑的大姐姐,只算是一个打字员。而我那可怜的对计算机的兴趣,一开始就被给毁了,我还以为计算机就是学习五笔+WPS+UCDOS。唉,如些看来入门老师还是很重要,可能一次糟糕的入门体验能毁掉你对一件事物的兴趣,好在我是幸运的,游戏让我重新认识了机算机的魅力。

虽然游戏让人重新找到对计算机的兴趣,而且我自己的第一个大一点非玩具式的程序也是一个能拿来玩一下的俄罗斯方块,但我自己却从来没有想过自己可能会成为一个游戏程序员,毕竟在我毕业的那个时代,游戏与互联网都还没有成为一个真正的成熟的产业,国内的游戏工作室是很少而且基本不成气候的,也只在网游找到了赢利模式之后,形成了一个巨大利润的成熟娱乐产业之后才慢慢的发现开发游戏的国内公司多了起来。在通过自学会了一点点C的皮毛,并通过侯捷老师的《深入浅出MFC》突然搞明白了什么是多态之后,终于有一个公司没有在乎我本科的专业,给我了一份工作,我成了一个写编辑器的C++程序员。

言归正传,话说两年前,在我厌倦了自己永远搞不懂的ERP开发之后,当时本着头脑中依稀对游戏开发神秘的好感,也看好于移动产业未来,我加入了Gameloft的北京工作室,成为了一个非典型的游戏从业者,因为在公司里我所接触的游戏程序员基本上都是从一开始工作就一直在游戏业中打拼。当然可能因为我的视角不同,所以可能会有一些不同于业内人士的感受吧。

一、全然不同的关注点与语境

当我到了Gameloft之后,首先发现的第一件事,就是游戏程序员使用着完全不同的术语体系,他们关注的总是帧数(FPS),三角形面数等指数,而且有一些词总是有一些特定不同于常识的含义,例如物理与AI都是指游戏中的特定概念。还有一些游戏专有的概念,利如UV、纹理、材质、寻路、动画、骨骼、路点、生死点及碰撞等等。这些都是一个要从事游戏业要搞明白的基本知识,唯有补充这些专业知识,才可能在游戏业中登堂入室,而且这些只是基础中的基础而已。

但是从另一方面来说,我接触的游戏程序员却多半不太关心模式,重构这些概念,对于高内聚与低耦合之类更是基本上不关心,agile与TDD之类在游戏业好象没有什么话语空间。DRY与KISS之类的原则好象在这儿不是太通行,曾经一度让我怀疑我是不是还生活在OO开发语境的生态之中,当然我的经历可能只是个例,但是我觉得可能国内游戏开发业与IT业内的交流不太多,整体不够开放吧。例如在游戏业内外能通吃的偶像级博主也大概只是云风一人而已吧。

二、iPhone与android当立,J2ME已死

其实我一入Gameloft时所进的项目组是NDS次世代平台,而后也曾在两个项目空隙之间暂时性的做过android与J2ME项目,而后一直都从事iPhone平台下的开发,所以对于这三个手机开发平台都还有一点认识,至于windows mobile平台、Symbian与Brew虽然支持原生的C++开发,但是由于开发成本,也多半不会为它们开发专属的C++游戏,基本上大部分是从J2ME移植过来的。而且这后三种平台基本现在是处于萎缩状态。虽然NOKIA的手机销量很大,但是它的Symbian开发平台真的是让人诟病,凡是我接触过做过Symbian平台的程序都多半不愿意继续在Symbian下开发。因为Gameloft不做国内市场,所以我不了解MTK平台。

先说J2ME吧,希望这个标题党的XX已死的口号不会招来太多人的口水,因为我这样说绝对不是为了哗众取宠,而是的确是这样想的。

1、J2ME的原创游戏先天怪味:我先说说原创的J2ME游戏吧,当我第一次看到J2ME写成的程序时,我当场就被雷得皮焦里嫩,程序有且仅有几个非常巨大的java类,而且怎么读都象是用java写成的糟糕的C代码,后来才知道这样是有原因的,因为手机游戏发行商的原因,对于游戏jar包的整体大小是严格的限制了,一般最大是1M,为了节约每个java类产生的元信息所占的大小,java语言的OOP特性只能被迫去除了,所以写出来的代码反而有着比较直接用C来写更古怪的不纯的怪味。在这样一种有着破窗户的示范效应的代码风格的影响下,真的很难有一个比较良好的代码质量,而与之伴随的自然是无尽的BUGs与牵一发而动全身的补丁加补丁。这样也造成了一个J2ME程序员基本成长空间不大的事实,因为这种代码质量及手机平台的硬件限制造成了在J2ME基本上做不出太复杂的游戏,并且程序员基本总是被BUG缠身,没有什么时间进行更多的思考与学习,除了几个个别天份很好的程序员,因为对于代码质量有更深入的追求,能在游戏开发技术上有更一步的精进,基本上我所遇到的J2ME程序员,都是将他们一年的工作经验用了n年。

2、J2ME的移植项目的体力粗活:至于J2ME的移植项目基本上就是IT业中的手工劳动密集的产业了。在讨论这一点之前,我需要大概说一下J2ME的游戏的开发流程:一个J2ME的游戏早期一般只会选一个主要的普及率高的手机作为目标机型,以它作为平台来只在它之上进行开发与测试,这一般被称之为主版(master),然后当游戏进入到alpha期之后,会另选出一些普及率次之但也很流行的手机作为目标机型,并在之上进行测试,一般会选出某一手机系列中比较有代表型的机型大概10个左右,称之为top10,在这之上开发的版本称之为次主版(submaster),然后大概等游戏进行到beta期之后,基本上就进入了大规模移植期,这时所有目标机型都会由一个专人负责,根据手机的厂商,手机的分辨率,是否支持触摸,是否有键盘等等功能,分出一系列子版本,在每个目标机型上进行移植开发与测试。如果不幸加入到这种项目中,每天的工作可能就是与分辨率,坐标,与手机的特性打交道了,恭喜你,你已经成为了蔡学镛所说的“程序女工”了,可能比较蓝领都不如吧。

至于程序女工,还是让我说两个悲惨的血泪故事,让大家明白我的所言非虚吧。惨案一:一个同事遇到一个程序只在某一型号的手机上只要跑到特定步骤就会死机,毫无头绪看不出任何问题的征兆,只到有一次偶然将一个局部变量改成全局变量时才解决了这个问题,原来是因为这个手机的J2ME的实现比较特别,将栈实现得特别小而且不给出任何异常,只要栈满了就毫无提示的死掉,只能放入堆中才能解决这个问题,遇到这种问题除了多了一个报怨的谈资与教训之外,其实对于真正的成长是没有太多的好处的。惨案二,对于不同的分率辨的屏幕布局是比较头痛的一件事,需要写时预定义一些与坐标相关的值,并考虑到不同分辨率之可能之调整,预留一些调整值定义的,而且鉴于java没有条件编译之说,不过好在有人创造性的使用cpp(C的宏处理器)来解决了这个问题,如果主版不是一个由同一个地理上的工作室上完成,基本上主版人员是没有什么动力将这样坐标魔数替换成预定义常量的,所有接手之人所做的事那就是各种魔数先博斗一番吧,哪怕运气好一点,每天为了坐标而不断调整也只是一件毫无技术含量的脏活而已,可能只能耐心有好处吧。而且也可能是大家都太耐心了,居然没有任何一个人想过要做一套统一的布局编辑器,虽然不能解决所有问题,但是能很大的程度上解决移植者之痛苦的。唉!

3、iPhone真是太爽了,虽然apple的审查制度让人不爽,再加上最近的那次开发者许可修改,封杀了诸如Unity 3D引擎的生存空间,但是总的来说在iphone下开发游戏还是最爽的,很少的几样目标机型,统一的分辨率(在iPhone4与iPad之后不再是了),完整的opengl es 2.0支持,充足的硬件资源(比起NDS不是好一点半点),完善的工具链再加上可以实时连机调试功能,再加上低廉的SDK价格,充足的社区资源与生态、支持C++等等。唯一可以算得上是缺点的地方,就是平台太好,竞争也比较激烈一点吧。此外有一点不知是否算是缺点的缺点,就是开发最后总是会需要Mac OS X的,你需要有一台mac,并且熟悉一下Mac OS X与Objective的,反正我是爱死这一点了。

4,android的前景不错,不过最近开发平台与营销平台还不算成熟,Gameloft作为第一手机游戏厂商在去年大辐缩减android上的投入就是一点证明,因为在android上投入产出比并不高,应该是低于iPhone。而且多机型测调试的问题也是存在,开发一款好的游戏,要在大部分的android的手机运行是需要花费更多的人力与物力的,这方面我的观点大概同于tinyfool的观点,不过随着android的占有率更一步提高,以及大量的原J2ME产业转型会更优先选择java语言平台,而非C++/Objective C++的iPhone平台,以及android的开源旗帜,末来的手机平台市场应该就是google与apple分庭抗礼了,至于第三家我现在是没有看到。

三、程序语言

现在的游戏语言主流还是C++ 与Java,虽然iPhone的第一语言是Objective C,但是因为它支持OpenGL及Objective C/C++混合编译,而且很多游戏都是一开始用C++写成,所以真正用Objective C还不多,除非是一开始专为iPhone所写且没有移植到其它平台的需求。Java就不用多说了,J2ME与android自然是用它。此外lua与sql(sqlite3)也在iPhone上有人使用,这个以后也应该会越来越多。不过可能又是一个有趣的个案,我身边的两个同事居然在需要一个排序算法时,直接人肉写出一个冒泡,而不是去用C++ 的sort,这种不研究自己所使用语言的行为真的是应该引以为戒的。

四、面向测试开发

我曾经有一段时间需要完善一个体育游戏的AI,结果发现了一个问题,就是程序的AI的“不可测”,当然这个不是海森堡的不可测,而是没有一套机制将出现时的场景保存下来,或者是将某个AI状态前的场景保存下来,能固定的重复,如果出现了bug,或者加了某个功能,你都需要手工操作人肉到那个状态(而且你还真不一定能人肉到),这实在是一件很痛苦的事情。其实在开发的一开始,就考虑这个问题,在底层提供一套序列化机制,能做到快照功能,并加上一个可控的伪随机函数,就不会出现一些所谓的不好重现的AI中的bug了,不过可惜项目的工期是死的,而且也没有太多人在乎这种质量问题,所在大家都只需苦练调试技巧就好了。

五、考勤加班与薪水

当一个公司大了之后,就会慢慢的有上大公司病,例如不再了解手下员工的工作情况,为了便于简单管理,会有严格的考勤制度,我觉得这一点对于游戏开发公司来说有点讽刺,当然这可能只是我的想法吧。此外游戏公司的加班自然是少不了的,好在Gameloft算是外企,周末的加班还是有双薪的,其它时候的加班那就算是贡献了,便是仅仅是为了一个诡异的完成期限(其实都是层层的留有余地)而加班,或又是一年年的欠上技术债而不愿还,搞到最后只能用加班撑门面,实在是说不过去。没有时间思考,没有时间阅读学习,没有时间生活,没有时间锻炼,此中的代价可是巨大的。不过说到薪水,手机游戏开发应该是高于其它行业一点点,但又低于网游公司一些吧,我说的是平均情况,其实与付出的代价相比,好象也不怎么多。不过从我最近观察到的情况,可能因为最近iPhone与android人才比较少有经验的程序人员(不限游戏开发)开出的价码还算可观吧,此外,现在基于SNS的flex的游戏程序员的需求也比较大,薪水还算不错噢,有兴趣的可以试试。

六、Joel测试

这个是纯报怨贴,不准备去Gameloft的人可以不看,我只说一下“9.你用到了你资金能力内可买到的最好工具吗?”这一条吧。公司居然在这一点上抠门,不肯购买Visual studio只让使用不能装插件的Express版本,本来可以提高效率的IncreBuild与Visual Assist X不能使用,你就等着VS在那个缓慢的编译吧,或者在需要打开某个文件时从文件树中一级级展开一级级查找吧,虽然commads可以减少一点这样的痛苦,但是它的补全功能也很一般。VAX的从声明自建定义,从定义自建声明的功能自然是不能用的了,你要一遍一遍去将两都定义全;没有了可以帮助重构的插件,你觉得大家会辛勤手工来搞定吗?或者大家都不重构,反正也没有人在乎。超级怀念我曾经买过的Ref++,可惜只支持到VS2005就停产了。自然也不会有人去使用DevPartner来寻找一个内存泄漏的吧。我也用emacs与e texteditor还有windbg与项目博斗了很久,可惜windbg的调试的友好性还是远差于VS,这样我总是要开着一个不拿来做编辑功能的VS express窗口,真TMD的别扭。好在大家都没有象我这样痛苦过,也许都从来没有高效过,或者是耐性极好。好吧,说VS太贵(真不贵,你与浪费的人力比,那个根本不算什么),每天开发需要的双显示器与mac mini总应该能按需申请吧,可惜没有,这两者的价格真的让我不好意思来说贵吧。我只是不明白为什么到了现在一个大公司居然还在这件事上犯糊涂。

七、引获

抱怨完了,还是说一点积极的东西,免得我形象太阴暗,象是一个破口大骂前女友的怨男。手机游戏行业虽然没有PC网游与次世代video game公司光采照人,但是也让我有机会能投身于游戏业内一窥全豹,而且也感受到移动产业的确是未来的金矿,虽然我现在不再做游戏了,但是依然没有离开移动产业。而且认识了几个牛人与交到一两个不错同事,其实这样还不够吗?

小结(总算写到这了,这篇博客也写得太费劲了) 总之如果从事手机游戏,如果你不是做iPhone或者是andriod的话,就不用做了,主要是没有什么前途而且是在谋杀生命。如果不做原创,也要慎重考虑。远离J2ME,远离移植,尤其是所谓的大规模移植。至于是否要入我的前东家嘛,兄弟你自己琢磨吧,我不表态。

此外,多学习点数学,多了解点语言,多品味点优秀的程序,总是对的。

Filed Under: Tags:

Comments