2008年5月31日星期六

将问鼎移植到MacOS上

事实上,在项目立项时,我就打算让问鼎及以后所有基于这个框架的游戏能够运行在至少包括Windows、MacOS、X-Windows上面。本来这更多是为了展示专业程度,然而,当我将办公环境从Windows迁移到MacOS上以后,移植工作看来具有了一定的实际意义 - 至少可以让我节省一台计算机,不必使用两个计算机进行工作这么麻烦。

毫无疑问,移植工作本身并不是一个真正的挑战,因为问鼎的架构从设计开始就为移植作了充分的准备。问鼎采用的来自第三方的模块都经过了仔细的挑选,包括 - CEGUI、OGRE、freetype、iconv、mysql client、sqlite、gloox、berkeley db、tinyxml、fmod - 都是可跨平台的;我们自己设计的代码C/C++模块也保持了高度的可移植性,所有操作系统相关的代码是剥离的;最后,主要游戏逻辑是基于LPC这样的脚本语言实现的,而其解释器本身已经在所有常见操作系统验证过了。

所以,我一直懒于进行这个力气活。直到前不久,我认为现阶段不会有闲人来做移植工作,于是我打算动手来解决这个问题。

因为CEGUI本身是可移植的,并且其demo包含了输入、输出这种与操作系统密切相关的实现,同时我们又修改了CEGUI非常多的代码,所以我开始从这个工程入手:先移植CEGUI及其demo。

CEGUI本身有Xcode的工程文件,所以移植只是一个毫无技术含量的力气活。不过gcc审美角度显然和msvc不太一样,很多新增、修改的代码引起了gcc的不满,基于gcc的Xcode报了上千处不满,我将用了差不多一周的时间它们一一剔除,才完成了编译和链接。浪费时间的主要原因是要将所有的第三方库都在MacOS上编译一次,某些工程的确不太好伺候,另外就是我对Xcode完全不熟(或者说是完全无知更恰当一些),寻找各个功能点耗费了大量的时间,好在集成环境本质上只是配置管理,把握住这一点,剩下的工作就是寻找想要的配置参数。

执行的时候因为路径问题,导致CEGUI不太愿意配合,我暂时没有理会这些问题,直接通过插入几条chdir指明相应的路径,让CEGUI先运行了起来。

当CEGUI完成以后,我打算一鼓作气解决问题,OGRE有for MAC的SDK,看上去不需要我费事,于是我为我们自己的模块逐个增加makefile,其中和操作系统有关的代码被我直接comment out,堵住了gcc的嘴,算是比较顺利的通过了编译部分。其中有一点让我倍加恶心,当我引用了多个namespace,而这些namespace有重名类定义的时候(比如常见的Rect、Point这些类),gcc对未指明namespace的类型会提出complain而不是采用某一个作为默认,为此,我修改了上百处类似的引用。

注:类似如下的代码
declare A::class1
declare B::class1
当你直接使用class1的时候,除非代码是在A或B的namespace内,否则gcc会很不愉快,即使你之前注明了using namespace A也无用。解决这个问题的一个方法是:显式的使用A::class1。


编译、链接完成以后,就是需要干正事的时候了 - 你总得为移植写点什么代码,毕竟窗口不会无缘无故的冒出来,消息也不会鬼鬼祟祟的被处理,软件领域只有01,没有雷锋。

本着偷懒的一贯原则,从sample中剥离出有用的东西再加工是我比较喜欢用的手段。我研究了一下CEGUI的demo,它采用了glut,嗯,这是一个跨平台的窗口库,很好,这种东西是我的首选,我总不想每次移植的时候都“写点什么”,能不写就不写才符合我的原则。

然而,这次我遭受到了打击,所谓“出来混,总是要还的”。用glut创建出窗口非常容易,但是当我把它们胡乱塞给OGRE以后,屏幕上一团漆黑,显然这才对的(期望偷偷摸摸的就成功那是入门级程序员的幻想)。不过我并没有急于去研究OGRE,因为我用的是SDK而不是自己编译出来的库,所以我无法调试它。我尝先让OGRE自己创建窗口,结果更糟糕,它直接崩溃了,而且是崩溃在OpenGL的函数中,这真是让人沮丧。因为这不在程序员所控制的领域之内,并不是靠基本功就可以度过的难关,我必须采用某种调试手段,针对第三方代码进行调试,糟糕的是,我并没有这种手段。

陈拓琳告诉我(他的一个优点就是能够知道什么情况下需要使用什么工具,并且知道工具在哪里),在MacOS下可以使用OpenGL Profiler调试OpenGL。我试验了一下这个具有奇丑无比图标的工具(图标是一个金属夹子夹着一串字母“OpenGL”,其实说它像是一个烧瓶更贴切一些,本来我以为这是MacOS下所能见到的最丑的图标,不过微软新出的Office 2008 for Mac看上去更能挑战我的审美观)。一开始我试图在某个执行OpenGL函数错误后停下来,我得手了,但是那里显然不是导致崩溃的原因。我改换了一下思路,在glDrawXXX这几个函数上设置了断点,我发现它们每次都执行成功了!并且Back buffer的确得到了更新,一直到最后一个图形绘制OK,并且成功的进行了Swap buffer。这让人有点困惑,不过继续跟踪的结果有所收获,第二帧绘制的时候就崩溃了。

我仔细考虑了一下,既然只能绘制一帧,那么似乎Frame buffer的使用有关(我看到有两个Frame buffer),即可能和窗口有点关系,我通过glut建立了一个窗口,让OGRE自己建立了一个窗口,所以我先comment out了通过glut建立窗口的代码,结果就不崩溃了,这样,我总算在MacOS看到了熟悉的登录界面。

那么,如何处理窗口消息呢?我发现可以从OGRE中取回它创建的MacOS窗口,这是一个Carbon的句柄,我在上面注册了消息处理函数,结果失败,我无法捕捉到我想要的消息(事实上我捕捉到了其中某几个),这让我很困惑。于是我去参考了一下OGRE的例子,它使用的是OIS - 某一个可以跨平台的输入系统,按照道理,这本应该是我的最爱,可是这时候我已经发现OGRE自己的例子在MacOS上跑得都有问题,其实它并不能优雅的处理窗口消息,和操作系统协作,它只是一个简单的具有破坏性的demo。

我试图改造例子就OK的思路已经破产了。

我痛下决心,抛弃了glut,我要坚定不移的使用Carbon。在此之前,我先下载并编译了OGRE,不调试它就解决问题目前看来是不可能的了。还好,OGRE编译起来要容易地多,因为发布者本身也发布了OGRE所需要的Dependencies,所以编译OGRE只是一个点击鼠标就可以完成的任务,只是需要的时间有一点久。

我仔细研究了一下OGRE针对MacOS的实现,发现它和Windows相比有所不同,基于Windows时我们可以创建一个窗口用作消息处理,然后让OGRE在这个窗口中创建一个子窗口即可;而基于MacOS时,我们创建窗口后,要将窗口中某个HIView控件的句柄传入OGRE,让OGRE在这个控件指明的范围内绘制,我一开始没有阅读代码,所以实际上是在走弯路,我试图让glut和它配合本身就行不通。OGRE这里的实现完全没打算和glut配合,如果我想使用glut,需要自行实现窗口相关的若干代码才可以,不能使用OGRE提供好的一些代码,这意味如果我使用glut,将来是不是节省工作不好说,现在就先要还债。

很好,那就横下一条心用Carbon吧。

为了了解Carbon,我通过Xcode创建了最简易的小工程,大概了解了Carbon的思路。它采用接受注册的消息回调来处理,消息本身由EventClass和EventId两段组成。而分发消息也是通过消息循环完成的,看起来和Windows比较类似,不同点主要有:

1. Carbon看样子并不能登记一个截获所有消息的handler,而windows的handler是收到所有消息的
2. Carbon有预定义的消息循环,Windows都要靠自己实现(这点有很严重的差别,后面有提到)

因此我遇到了几个问题:

1. 如果MouseDown被我登记的handler处理后没有继续往下一个handler传递的话,很多窗口行为就丧失了,比如拖动窗口移动、关闭、最小化。我可不打算自己来实现这些,所以我倾向于把MouseDown继续传递给Standard handler(MacOS自带的),结果就是它会进行Capture,让我登记的handler收不到MouseUp。这真让人疯狂,我只好选择不让HIView内(相当于Windows的client area)的MouseDown继续传递,在以外区域的MouseDown就让后续的handler看着办吧。

2. 我用ReceiveEvent、SendEventToTarget来模拟类似Windows的消息循环,结果无法点击应用程序的菜单,为了这个事情我纳了半天的闷,最后看到文档下面写得清清楚楚,用这种方法就会如此... 苹果的开发网站上给了一个解决方法,太复杂,我投降了,还是用预置的消息循环吧,我另外注册Timer来解决消息循环中调度VM、进行渲染等问题。(这样效率不够高,而且响应还不是最及时的)

消息输入完成以后,进入游戏倒是很顺利,没有出什么大问题。接下来我在尝试把CEGUI当作私有的Framework并入应用程序时又遇到了问题,启动时抱怨在/Library/Frameworks下没有找到CEGUI,见鬼,系统不在本地的Frameworks下寻找跑那么大老远去找干什么?为什么OGRE就没有这个毛病?苹果的开发网站上给了答案,在build CEGUI时,需要在Install directory中执明是@executable_path/../Frameworks即可,原先指明的是/Library/Framrworks。更换了这个设置以后build出来的CEGUI,再被应用程序所链接,应用程序就可以访问位于私有目录下的CEGUI了。

最后就是收尾工作,扫荡所有留下的临时代码(比如强行设置路径,指明某些配置),需要采用一些方案能够在多个系统之间兼容,制作发布脚本,这些都是程序员的本分,属于可控的领域内。

完成这一切工作以后,基于MacOS运行的版本终于可以发布了(当然还有许多不足,某些功能也有缺欠)。应该说,游戏的移植相对是比较容易的,因为GUI系统相关的代码是最不容易移植的,而游戏很少使用它。

最后总结,如果打算移植,需要做点什么?

1. 设计时就准备好移植,采用可移植的第三方库、封装操作系统的函数、抽取操作系统相关的实现
2. 移植时按照这个步骤:编译 -> 链接 -> 小Demo调试 -> 集成调试 -> 逐步完善。每一步我们都只考虑完成相关的任务就可以了,避免把问题弄复杂。

ps:在我移植帖子的时候,已经是2010年6月了,两年过去,项目组为了维护多个平台的代码花了很大的力气。这并不是说保持在多个项目之间的同步有多大的难处,而是我在这次移植时没有完成所有的工作。

正确的做法应该是开发整个中间键,用来提供所有操作系统相关的功能,不能在某些代码中嵌入操作系统相关代码,然后用#if控制编译分支。当初我认为代码实现的差不多了,就没有花力气整理中间键的架构。后来因为项目有一些新的需求,结果代码增加的越发混乱。

后来,项目组一度尝试用wxWidget来作为中间键,这显然不是一个好主意,因为wxWidget过于庞大笨重了,让它和Ogre这些同样是重量级的模块耦合显然是不合适的。而且我们根本不需要用wxWidget这么复杂的中间件,毕竟游戏只需要一些很简单的I/O功能就可以了。

2008年5月29日星期四

基于MacOSX的问鼎版本移植完毕

先庆祝一下,改天再写过程。

2008年5月24日星期六

万物浩繁 生命苦短

一个人所能观察到的时间,大概是1百年左右。而周朝建立于公元前1千年,至今至少已经有3千年了。在这3千年年中,中国出现了多少战、和、乱、平、悲、欢、离、合、生、死?

中国不大,不到世界面积的7%。
生命不长,不到有史以来的3%。

2008年5月20日星期二

简单沟通 - 我们为啥不能把事情弄得简单一些

今天和同事讨论工作上的事情的时候,无意谈到一个事情:

一叶 2008-05-20 13:59:48
不同人看问题的角度果然不一样,前几天我桌上的100元掉在地上,扫卫生的阿姨居然以为我在试探她.....因此心理很不舒服.....没想到我的疏忽导致了这样的效果。

doing 2008-05-20 14:01:15
!@#(*!&@#)(!*

doing 2008-05-20 14:03:02
都是一帮无聊人惹的祸 - http://zzwb.zynews.com/html/2008-05/17/content_758633.htm

doing 2008-05-20 14:03:59
很多人就喜欢玩这种无聊游戏,旁敲侧击还自鸣得意,以为自己的招数很高明,结果就是大家一天到晚在哪里瞎揣摩,把很简单的事情变得复杂了


唉,如果说有些事情不能当面得到答案,我们完全可以设计一些考核方法而不是采用这类莫名其妙的窥探手法。相比这种土法,我更喜欢专家们设计出来的基于统计学的数学手段。

2008年5月19日星期一

我们没有必要将自信建立在谎言之上

看到天涯地震专区的一篇转载及其回复,正文是发布者转载了光明日报的一篇文章,其中谈到了联合国新闻发言人痛斥西方记者关于中国救灾中没有立刻让他们进入灾区采访的质疑。接下来我看到很多人纷纷叫骂嘲讽,藐视西方记者,而其中一名为“letwin778”则发表了看上去不太合时宜的文章,其观点大概如下:
  1. 光明日报的内容属造谣
  2. 之前环球网翻译的一篇美媒体的报道“人民的总理是抗震英雄”也属于类似曲解
  3. 依靠虚假的消息来获取所谓的广泛的支持是可耻的
然而我看到接下来就是铺天盖地对此人的指责,斥其为网特。关键在于,没有人挑战他的观点1 & 2,两者是否是造谣?大家都强调说:我们的媒体不可信,难道是西方的媒体可信?你一定是网特。

我不敢说此人是否是网特(我也不知道是否真的有网特这个职业,姑且不评论),我只是觉得我们广大回帖的爱国者怎么一点逻辑都没有呢?我们的媒体,引用的是国外媒体的文章,我们的引用是否客观、全面这是很容易判定的,何必把外国媒体是否可信、真实这个不相干的话题引入呢?

因为1的资料不全,我没有仔细去看。我看了2,果不其然,我们媒体断章取义,只截取了原文的2/3,而删除了关键的1/3,把一篇讽刺温家宝总理的文章硬生生的变成了赞扬的内容。

Yahoo news:news.yahoo.com/s/ap/20080517/ap_on_re_as/china_earthquake_hero_premier
环球网译文:china.huanqiu.com/roll/2008-05/114521.html

我想,我们何必非要曲解别人的文章给自己贴金?温家宝总理表现如何,难道区区一篇国外媒体的文章就可以定论么?他们并非是上帝,何况,就算是上帝,也管不着我们中国人。这种偷梁换柱的做法,无非是缺乏自信的表现,给我们的总理反而是抹黑了。大家不愿意听到别人的批评,甚至对将别人的批评伪造成赞扬这种事实都视而不见,不想辨别真伪,难道这种鸵鸟政策能够让我们更强大吗?能够让我们的敌人畏惧吗?

我自横刀向天笑,去留肝胆两昆仑 - 百年之前谭嗣同何等气魄,生死无惧,而今百年已逝,怎么堂堂中国人却这么猥琐?面对谣言都没有揭穿的勇气了吗?

原帖出处:cache.tianya.cn/publicforum/content/help/1/137175.shtml

全国哀悼、纪念汶川地震死去的同胞 - 网游运营停止三天

来自公司的通知邮件:

2008年05月19日-2008年05月21日为全国哀悼日,国务院要求这三天内停止所有娱
乐活动。接光宇通知(光宇接国务院通知),《问道》游戏(包括内测专区)需要停
服三天。


愿死难者安息。

2008年5月18日星期日

应需求而生的作品 - 让我佩服的浑身投地

在查阅baidu搜索榜时发现了这篇小说的简介:
www.qidian.com/Book/86766.aspx

很好,很强大。作者简介直奔主题,满足大家的YY需要,能力无限、钞票滚滚、后宫开阔。关键词给的也足够符合流行口味:作品关键字: 异能,猎艳,YY,刘磊,赵颜妍,后宫,穿越,寻美,除了主角及原追对象两个名字,全部都是主流关键字。

作者真是与时俱进,应广大读者需求而生成,飘进搜索榜,似乎算是不太意外?

注:书没看,不知道究竟好不好。

ps:我建议策划琢磨一下其中三味,当然,不是去学习这个庸俗的调调。

如此才女,不做也罢

这是引自某个小MM的说的话:

我是一名6年级的小学生,在学校是大队长,在年级是“才女”(老师同学们的认为,我自己觉得文章不是很好),在班里是班长...

每天很忙。我是大队长,所以早读、自习、习字这些课我都忙着学校的事,每天上这些课时我都在校园里穿梭——而且我发现几个大队长里就我工作最用心,每次吃亏也总是我,可我觉得自己没有她们“精”。我每个星期六都有课程,8点到10点奥数,10点到12点语文快班,下午2点半到4点 班英语辅导,这样几乎一天都在学校,现在我每个星期天下午有要学钢琴,很忙很忙。我喜欢看书、画画、写一些东西,可是根本没有时间。星期一到星期五的晚上 都在写奥数作业、英语辅导班作业、语文快班作业,而且我数学虽说书本上学得还行,但学奥数脑子根本转不过弯來,我低年级的一位老师暗地里告诉我爸爸,我脑 子笨,對我放弃。我很难过,但是我一直在努力,背诗经、看名著、做自己布置的额外的作业,头发每天要掉好几十根。

其实人在某一方面的成就 = 相关天赋 * 后天努力,嗯,是乘法而不是加法。大部分人在某一方面的天赋是几乎相等的,所以成就主要看后天努力。但是要想成说传说中的才女,那是非要先天天赋不可,仅靠后天努力是不成的。就算一时通过花费了更多的时间拔尖,很快也会随着成长被非人类轻松超越,既然如何,这种保鲜期不长的才女,不做也罢。

原文出处:blog.sina.com.cn/s/blog_4c9ddfd701008ztj.html

现在的设备怎么越来越复杂?

昨天晚上想看“立春”,找到了DVD,但是却没有DVD机器,于是我在陈拓琳电话遥控指导下:
  1. 打开了他的电脑,把DVD放入光驱
  2. 打开某个媒体中心的软件,将DVD文件加入资源
  3. 打开PS3,找到共享的媒体资料
  4. 播放
然后20分钟后,播放时声音出现了混乱,断断续续的,前进、后退均无效,我自认为没有能力解决此问题,于是打开自己的电脑,用电脑看了这张DVD。46"的电视没看成,退到26"了(因为电脑播放时还有一个巨大的黑边...)

看罢这个凄惨的片子,我敬仰的看着一地的线(网线、电源线、信号线)、一茶几的遥控器(电视、解码器机顶盒、PS3、高清播放设备...),它们正在无声的向我示威 - 算你们狠,还好我出生在20世纪。

缺什么补什么 - 谈惠普奇迹

惠普经过马克·赫德这三年的折腾,起死回生了。

tech.sina.com.cn/it/2008-05-17/09292201108.shtml

商业评论的作者王育琨着实赞扬了一把赫德先生深入基层,发挥民主的优良作风,似乎这就是一剂灵丹妙药。我想,这对惠普来说可能是妙方,对其他企业恐怕就不见得。

治大国有若烹小鲜,而人喜欢吃什么菜?很难说有一种绝对好吃的菜,大鱼大肉吃多了,就很怀念白粥这样的淡饭,可是天天喝白粥,那就有些期盼大鱼大肉了。大家说,那结合吧!三两顿大餐,两三顿小菜?可是这样的结果就是,一天到晚都没胃口,看什么都提不起兴趣了。所以说,烹一顿小鲜容易,烹十年小鲜难啊。管理企业也是如此,没有一种稳定的、公式化的模式可以让企业长青不老,改革不可避免。

问题是,在什么时候,做什么样的改革?马克·赫德要么运气不错,要么眼光不错,总之,他选对了。但是这种例子却并不说明,所有的企业都需要同样的做法。当然,如果企业长期以来,一直没有用过这种做法,那么我觉得实施它的结果可能会很不错。

2008年5月12日星期一

看样子8并不见得就是吉利的数字啊

距离2008年8月8号奥运会还有88天时,四川汶川发生了如此剧烈的地震,死伤无数,看来8这个数字并不见得吉利啊。

记录一下折算作功的常量

2万吨TNT相当于8x10^13焦耳 -> 1万吨TNT相当于4x10^13焦耳。

出处:http://tieba.baidu.com/f?kz=111722223

2008年5月6日星期二

从电视直销的亏损看网络游戏的前景

在新浪上看到七星购物07年亏损的消息,文中有一句很有意思:

七星购物有关人士告诉记者,对于电视购物公司来说,最宝贵的不是产品,而是媒体资源。

网游行业很有点类似的感觉(虽然大量的网游产品比电视直销的产品看上去要强一点),目前更多的产品是在竞争媒体资源,比如QQ、17173,结果就是网络广告价格飞涨,最终盈利的都是这些网络媒体。

如果网游还是继续这种低产品附加值的路线,看样子离电视直销的末路也不远了。

原文出处:tech.sina.com.cn/t/2008-05-06/00522176760.shtml

2008年5月5日星期一

这个故事给游戏策划看看不错

在百度的信长词条看到了一个小故事:

三好义继战死时,三好家一名厨师名叫坪内也成为织田家的俘虏。当时,信长对坪内说:“料理好吃的话,就免你罪并录用为厨师”。之后坪内做料理给信长吃,信 长说“这料理都是水”正打算对坪内处刑时,坪内要求再给一次机会。而第二次拿出来的料理,信长夸说“很好吃”、于是雇用其为厨师。之后坪内被问到“一开始 就拿出第二道料理来不是很好吗?”,坪内的回答取笑了信长说:“一开始我是做京都风的高级料理、之后只是做重口味的乡下料理罢了。终究信长公也只是一个乡巴佬而已”。于后天听说了此事的信长说:“只要是受雇为我的厨师、首先必须努力做出我喜欢吃的料理才是家臣的本分。而对此怠慢者单单只是无能而已。”

这个故事的真实性我没有考证,不过其中的道理很正确呀!作为策划,不能挑战用户的需求

想清楚你的目标用户是谁,然后满足他。

2008年5月1日星期四

神奇的王千源

今天看了一下百度搜索排行榜的人物栏目,发现名为王千源的勇夺搜索排行第一名,好奇之下检索了一下她的相关资料。

因为没有权威的事件经过出处,我只能根据多处搜索结果的共同点给出以下说明:

  1. 王千源高中毕业于青岛二中,随即赴美就读DUKE大学qd.people.com.cn/GB/channel5/200706/29/54952.html
  2. 王千源表达了从政的意愿(出处同上)
  3. 王千源出现在2008年4月9日DUKE大学的中国留学生自发组织的“支持奥运反对”藏独“的集会游行中(有视频为证,无法给出稳定的链接,可以自行搜索)
  4. 王千源可能出现在和中国留学生对立阵营的队伍中(视频表现不详,但是很多资料指证这一点)
  5. 王千源对待持雪山狮子旗的人员采用了和中国留学生阵营不同的态度(据说是试图调解,但具体言语不详,没有看到直接出处)
  6. 王千源被某些网友认为是汉奸,网友发动了一场声势浩大的”人肉搜索“,曝光了王千源及其家人的资料
王千源是否是汉奸我当然无法给出定论,先不说现在汉奸的定义本身就有些泛概念化,我们对她的言行都不甚了解,怎么可能就此下出结论?我想大部分网友对事实的了解不会比我更多,那么为什么会有这么多人跟着砸棒槌?

约翰逊曾说“爱国主义是流氓的最后庇护所”,这些恨得牙齿痒痒的痛骂汉奸的人群中,有多少是披着爱国外衣的流氓呢?

为了维护中国的领土完整和主权尊严,我们需要付出巨大的努力,有多少人成为了其中的一员?口头喊喊是多么的轻松,这可不是付出努力。