« August 2009 | Main | October 2009 »

September 29, 2009

有点神经过敏

最近网上流传着许多关于 SSL 安全性的传言。由于大多数相关链接由于总所周知(?)的原因,不能访问。大家自己搜索 "GFW发飙,SSL窃听?" 这篇文章读。里面提到这么一个东西,据说 "妄想使用Gmail等采用HTTPS登录的Webmail逃避检查也是徒劳的,UTM Plus内置的SSL代理可以截断所有单向验证的SSL请求,对解密后的内容进行控制、审计。也就是说,利用这个代理,一切基于SSL隧道的应用协议都被纳入控管范围,不会再有漏网之鱼。"

我初看时,不以为然。不就是做个假证书做中间人攻击么?关键还在于用的人自己要有足够的安全意识。


前两天我爸过生日,买了个 HTC Hero 送他。配置机器的过程中,我加了个连接到 https://reader.google.com 的书签。没想到,刚一访问,浏览器就警告:这可能不是您要查找的网站。

我想我是神经有些过敏,仔细检查了一下证书。发现是签给 www.google.com 的,而不是 reader.google.com 。真是奇怪啊。有点不放心,再检查了签发 CA 的 Thawte ,貌似不是家山寨 CA 。

DNS 换到 openDNS 也没有问题。还是不放心,问了国外的朋友,google 的证书的确是这家公司认证的。另外,我再用 tor 看了一下,也没有问题,这才放心。

btw, 最近 tor 终于沦陷了一半。回想起去年 twitter 上的同学给我转的有关 tor 的安全问题的几篇 paper 。不过似乎只是公开目录被墙了,搞到些匿名的 tor bridge 的 ip 加上去还能工作。


刚好,最近两天相关的帖子突然在我的 reader 里出现了许多,有兴趣的可以参考阅读。

理解SSL窃听

SSL窃听攻击实操

注:开放自己公司域名下的 email 注册是个很糟糕的安全隐患。记得刚到网易时就有同事跟我聊起这个。可惜早期网易以 163 邮箱起家,即使很早发现这个问题,也已经晚了。


国庆休假,不过还有些工作要做。下个月要去帝都参加 csdn 组织的软件开发大会,得准备一下幻灯片。这次我计划的题目是: C/C++ 与 Lua 的混合编程。

还想花点时间理一下项目里不是我写的那部分代码。

闲余时间在读杨小凯的《牛鬼蛇神录》,还不错吧。

September 22, 2009

关于 GMA500 这块显卡

我的本配的 Intel 板载 GMA500 的显卡。当时选机器的时候就考虑过显卡因素,性能不重要,但是驱动要支持 opengl 2.0 ,这样至少我可以在笔记本上有限的调试下程序。wikipedia 上说 GMA500 支持 Opengl 2.0 我就信了。

拿到机器后,很是一阵折腾,把 Linux 下驱动装好。果然可以查询到 Opengl 2.0 ,不过支持的不算太多,或者说我们的程序没有彻底的测试,有些写的不规范的地方,不是那么顺利的可以跑起来。还需要慢慢改。

Windows 下是彻底看不见 Opengl 了。有点不甘心。

拿出我的 google 技能,想出各种关键词,终于发现 Intel 有个 IEGD ,Intel Embedded Graphics Drivers 。最新的 10.1 是支持 US15 的,也就是 GMA500 了。赶紧在 Intel 开发者网站上注册了个号,下载了回来。

拉回来的这个包居然可以生成各种平台的驱动,一阵窃喜。不过设置非常麻烦。一开始不太会用,按提示去下载了 OpenWatcom (后来发现,如果仅需要生成 XP 驱动的话,其实不用装这个)。

话说,稍小点的开源项目都有个毛病,就是喜欢在新版本中改东西。您要是完全不懂开发,或是完全不想折腾,还真别去用。虽然大多是些小改动,但是几个项目要配合起来总得自己动手弄一下。比如,IEGD 要求 OpenWatcom 1.7 版以上,我去下了 1.8 。发现最后的编译脚本跑不过去。原来编译器启动程序,从 wcc.exe 改为了 wcc386.exe 。幸亏 IEGD 有 build console 可以查 log ,否则学 Windows 软件的传统,那绝对是一抹黑。OK , 换个程序名即可。

IEGD 里的一大堆参数很细致,很难填。比如分辨率默认是没有 sony vaio p 的 1600x768 (25:12) 的。那些扫描同步时钟等等都要自己试。好吧,我很懒,并且坚信不是世界上第一个想干这个事情的人。(自己 Build 一个 Sony P 的显卡驱动)google 帮我找到了。也想自己折腾的人看这个贴

最后生成 的时候记得把 1600 768 填好,否则系统启动会出现各种彩色的竖线。

最终,我把驱动换掉了,工作还算正常。显存居然从原来的 8M (Intel 官方的驱动)变成了 256 M 。OpenGL 版本变为了 2.0 。没有测试游戏的实际性能,不知道对某些游戏会不会提高。反正呢,我也不打算用本来玩游戏的。

只是,最后有个缺陷。当系统从待机状态恢复时,屏幕不能变亮。注意,只是没有变亮,各种操作都可以做的。我凭记忆盲敲键盘可以重启机器(这个时候鼠标就排不上用场了)。从某个角度看液晶屏,也隐约可见。

google 到另一个同学和我一样的经历。见这篇:用SONY VAIO P玩暗黑破壞神II (需翻墙) 。

还有另一篇也是抱怨新驱动不能解决 standby 问题的。

不过新驱动解决了我另一个问题:如果我在 XP 下打开电源管理,只要把直流电拔下来。电源管理程序 SPMgr.exe 就会报错,很讨厌。这也不是我一个人碰到了。新的驱动下不会这样,不过貌似电源管理工作还是不正常,也没精力多想了。

ps. 通过搜索找到这里,想要显卡驱动的同学注意:我不提供自己编译出来的显卡驱动,不要问我要。它很不完善。要么等 Intel 把问题都解决了发布新版本;要么自己去下载 IEGD 的开发包自己折腾。


最近业余时间还是在玩桌游。港口 是个相当有趣的游戏。比作者的前作 农场主 都好。入门其实很简单,如果没人教,自己读英文说明书大约需要 2 小时;而我学会了教别人玩大约 10 分钟能讲清楚。

游戏系统简洁有深度。可以看到许多别的游戏的影子,但有自己的独特风味。比如我玩银河竞逐比较多,就看到了许多 RFTG 的影子:制定发展路线,更换发展路线,关注对手的路线……

哦,又说起 RFTG 。网上看到很多中文的评论。都说这个游戏没竞争性,大家只顾自己发展,比较沉闷。唉,没入门啊。且不说 RFTG 的第二扩充加入直接攻击对手,把对抗直接提了出来;即使是原始规则里,我们这里的同学玩的时候依然很刺激。大部分时间都需要揣测对手会出什么牌,对手想干什么。一味的埋头干自己的事情的人是很难赢的。

当然这需要大家对游戏都有深刻的认识了。跟新手玩不太一样。不过大致还是可以去猜测新手的出牌来帮助自己快速胜利的。

除了揣测对手的行为,RFTG 同时要计算很多概率。这建立在对牌库相当熟悉的基础上。对手的行动对概率的影响很大。拿到每张牌,组成想要牌套的概率,随时都在起变化。这些变化又是可以被预测和控制的,这恐怕是有经验的 RFTG 玩家的乐趣之一了。

这是个常玩常新的游戏。期待第三扩展。

September 20, 2009

关于 taobao 首页的迷惑

前几年,我一直挺反感 taobao 的。因为到处都是广告,而且是很恶劣的弹出式。最近一年,发现有些东西还真得在 taobao 买,也就慢慢接受了。其实不是一开始如我印象般的差。

最近有个疑惑:为什么 taobao 的首页导航,购物车,收藏夹等等在左上很明显。而"我的淘宝"在不对称的右侧广告条下。每次都多花 5 秒以上定位。

把广告条插在导航条的中间,真有创意啊。

好吧,好几次都没能顺利找到我想找的入口。我承认跟我的使用习惯有关。

如果没啥事,我一定不会首先想到要登录系统。因为“登录” 只是一个过程,不是我的目的。

往往我去 taobao 首页,只是想看看我买的东西店家发货没有。至于买东西,有一半机会是从 google 搜索来,直接奔入商品的页面的。

这个时候,查询是我的目的。经过一次经验,我知道我要找的是一个叫 “我的淘宝" 的入口。然后,如果我能顺利通过这个入口,系统需要让我认证身份的话,自然会有登录界面来询问我。

有好几次,我在寻找 "我的淘宝" 时遇到了困难。假设首页干净到只有 ”登录“ 选项的话,我会毫不犹豫的先选择登录这个唯一入口。可是在页面的右上方,又有诸如”购物车“,“收藏夹” 这些导航栏。下意识我觉得,我应该会在首页找到我需要的链接的。(事实上它也存在)

我的另一个疑惑是,某些情况下,推迟身份认证的时机有必要么?既然最终确定买东西必须有身份认证。那么“购物车"的链接和"登录"同时存在于首页有必要么?如果我还是匿名状态,而且一直在选购商品,我没有多少可能总是从首页进入购物流程。正如去逛超市,我不会买每件东西时都从大门口走。(虽然很多东西我从大门口开始走,可以更明确的定位货架)所以,我几乎不会有从首页查看”购物车"的需求。

如果我昨天选的商品,今天才下单(这样会在今天重新打开 taobao 的首页),那么我一般会选择先收藏,而不是暂时放在购物车里。这不符合一般消费习惯。而且太长时间过后,很难确保要买的东西还处于当初看它的状态。这个时候,首先登录,继续昨天的流程才是最自然的想法。


闲话这么多,是我知道这篇一定会被 taobao 的兄弟看到,说不定会有点效果。

当然我也知道,对于大网站,大公司,修改一点东西是多么的难,很多时候并不是技术问题,也不是开发人员,设计人员意识不到问题。

还有,阿里作为一个大公司整体,不会缺那几个广告位的钱。但是把事情分摊到更下的部门,情况就不一样了。就如 taobao 的搜索,不客气的说,那是真的做的很滥。但偏偏要自己做。我相信如果有接口,google 和 baidu 甚至 youdao 都会做的更好。但我也很明白,这是不大可能的事情。


这次想买支笔,去 taobao 搜到下了单,但是卖家居然过了一周还没发货,郁闷。

什么笔呢?就是那个老笑话里说的那支。

“美国航天部门首次准备将宇航员送上太空,但他们很快接到报告,宇航员在失重状态下用圆珠笔、钢笔根本写不出字来。于是,他们用了10年时间,花费120亿美圆,科学家们终于发明了一种新型圆珠笔。这种笔适用于失重状态、身体倒立、水中、任何平面物体,甚至在摄氏零下300度也能书写流利。 而俄罗斯人在太空中一直使用铅笔。”

我倒真想看看是啥笔,就订了一支玩玩。

关于这个笑话,真正好笑的是编这个笑话的人,可以参考这篇网文:有一个流传甚广的故事宇航员与铅笔

其实还有另一个关于电风扇吹香皂盒的段子,也是流传甚广。甚至于半年前,连丁磊都从 popo 上转给我看。正巧我老爸也是学自动化出身的,对此深不以为然。上次我在网上跟他聊天谈起这个,他扔了个帖子给我。


这个世界上没有什么所谓灵机一动就能解决的难题。如果人们在某个问题上肯消耗大量的时间和精力,那么他们一定不是傻子,至少不会比那些一拍脑袋就觉得自己能搞定的人傻。

小的时候,我记得有次家里吃饭,不知道是什么话题说起 “点子大王” 何阳,我爸那是一脸的不屑。当时年纪小,不是很能理解。没过两年,那家伙似乎因为诈骗被关起来了。

本以为这些也就是骗骗小孩子,慢慢发现,其实成年人也挺容易被蒙的。:D


就和赌博或是投机中国股市一样。明明经过概率计算,知道自己多半(甚至是在概率意义上的肯定)会获得负收益。但却就是觉得自己比别人运气好/更聪明/更有能力…… 从而赚到钱。有时候成年人连小孩子都不如呢,小孩子起码知道自己不懂。

September 18, 2009

谨慎使用新文件系统

由于是新装的机器(笔记本),我一时图新鲜用了 ext4 。

今天编译 Linux kernel 的 2.6.31 ,make 时报错了。感觉很奇怪,我就是解开的官方网站上的 tar 包啊。打开出错的文件观察,发现中间有大约十来个字符变成了乱码。

一阵不安涌上心头。

赶忙把 tar 包另找位置重新解了一份,对照文件看了一下,是完好的。那么要么是硬盘出问题,要么是文件系统的软件故障。

首先排除硬件故障。如果硬盘坏了,操作系统在控制台上一定会报错。而且也不会全部顺利读出来,而中间只有几个字符被篡改。

所以多半是 ext4 的问题了。

话说,一个新的文件系统至少需要五年才能稳定下来(某同事语)。像 ReiserFS 这种代码比较乱的,十年了还不断的有 bug 被拣出。

真不该选择今年才诞生的 ext4 啊。

悲剧。

AOI 的优化

去年写过几篇过于 AOI 模块的设计。将 AOI 服务独立出来的设计早就确定,并且一定程度上得到了其他项目组的认可。(在公司内部交流中,已经有几个项目打算做此改进)

最近一段时间,我在这方面做进一步的工作。(主要是实现上的)

首先,基于 KISS 的考虑,删除了原有协议中的一些不必要的细节。比如,不再通知 AOI 模块,对象的移动速度。移动速度虽然对优化很有意义,但毕竟是一冗余数据。考虑这些,容易掉入提前优化的陷阱。

其次,增加了一条设置默认关心区域的协议。这是出于实用性考虑。

原本的考虑中,我希望应用者按需为每对实体设置 AOI 消息。但是,当场景中实体过多时,将浪费大量的进程间通讯带宽(内存和处理速度上倒是可以优化)。往往,一个 AOI 实体不会关于过远的其它实体,所以增加一条协议,可以缩减大量的模块间交互。即,那些老死不相往来的实体间的消息就直接过滤掉了。

在实现上,我采用的最简单的了望塔方案。如果应用层需要让每个实体最多关心半径为 100 米内的其它实体,那么就按合适的间隔(比如也是 100 米)设置一个了望塔对象,由了望塔通知它,附近有哪些东西。

了望塔对应用层是不可见的,它只是一个具体的实现方案。而这个通知协议也只保证大略的信息。只是通知实体,附近(不一定是严格的设定半径,但一定大于应用层设定的范围)实体的增删。

应用层根据这条协议维持自己私有的一个可见集合,再结合其它 AOI 协议得到精确的 AOI 消息。


了望塔的分布应该怎样设置?

一开始我首先想到的是简单的按 2D 网格分布。但是这个方案不到 20 秒就被否定,因为直觉告诉我它不是最优的。然后我试图寻找更好的方法。比如交错开排布。

      __    __    __
     /  \__/  \__/  \
     \__/  \__/  \__/
     /  \__/  \__/  \
     \__/  \__/  \__/

画出来后,同事说,这不就是移动通讯中用的蜂窝网吗?

是啊,很容易证明这就是最优的分布方案。因为每个实体只需要被三个了望塔监控就可以了,而不是 2D 矩形网格方案的四个。六边形的外接圆之间的覆盖面积比例(重复区域)也比正方形的小。

实现时,我们可以生成多级的蜂窝网应付不同的应用层需求。

September 15, 2009

Sony Vaio P91 装机简录

我一直不用笔记本的。因为不想背着个累赘到处跑。笔记本的键盘也用不惯,屏幕不舒服。前段时间,一个同事颈椎出了点毛病,据说就是用了几年笔记本给闹的。确症后买了外接键盘,在办公室也外接显示器用。

如果不是近期需要出差比较长时间,而且还需要在出差期间写代码,我是不会动这个念头的。

挑了几天后,决定买 Sony 的 Vaio P 系列。比较了一下,发现国内行货的 CPU 比较慢,而日版的 P91 可以升级到 Z550 ,有 2GHz 的主频。(不过 Atom Z 系列终归是好不到哪去,只能快一点是一点了)最终决定找人从日本代购。

选择日版还有一个理由:行货的 P29 居然只有黑色可以选 :( 我喜欢那款很拉风的酒红色,同时也想要 SSD 硬盘。

P91 是由自己选配,代购店问我要配置单的时候,犯了三个错误。

其一,虽然我平时不用摄像头,也从来没用过。但是,加一个其实也不坏。但是代购的人居然搞错,让我以为摄像头是默认安装的,结果买回来一看,面板上的秃的。安慰自己说,也好,外观更整洁了。

其二,没有加钱换英文键盘。原以为原配的日文键盘仅仅是多印了一些假名而已。拿到手才发现,各种符号的键位完全不一样,相当之不适应。而且 ubuntu 下配置成同时两个键盘布局(另一个工作于外接键盘)非常之麻烦,尚未找到好的解决方案。好在我这人随遇而安,用了两天后,也就凑合了。

其三,日版 P91 默认是没有国内行货送的那个 VGA/LAN 接驳器的。又被我想当然了。好在第二天自己核对了一下,赶在正式下单前补上了。否则就只能用 wifi 了。

卖家对我选择多花 1000 多升级 CPU 很不解,他觉得 Z550 也不会快多少。我感觉是应用吧,像我这种经常需要编译程序的人,CPU 还是很重要的。每次节省个十几秒,积少成多。

P91 有 WWLAN 和 GPS ,这个不错。

在卖家的怂恿下选择了激光刻字业务。只是刻自己名字实在太傻了,所以就让刻了一行: "Keep It Simple, Stupid!"


非常不幸的是,经过漫长的等待(因为定制的机器要现造),邮包入海关时被扣了。据说这种事情发生的不多,又有谣言说,最近海关要创收,查的比较严。我那个写着车载 GPS 的邮包就这样被截留了。

好吧,我一直是遵纪守法的好公民。让报关就报关,谢绝了卖家的建议(一口咬定是旧机器返修的,并注明价值 1000 RMB ,以及帮我提供一系列证据),如实报关。这玩意很小,包装也小。我觉得说它是笔记本不太可信。其性能跟我心目中的笔记本也相去甚远。也就在报关单上注明是一 PDA 。

海关的大哥打电话来说,PDA 嘛,200 RMB 一口价。我很爽快的补了税就P颠P颠的取了回来。东西前后在海关停了 4 天。经网上查询,笔记本的税费一口价是 1000 RMB 。


系统默认安装的是 vista ,那叫一个慢啊。第一次用 vista 就让我非常的不爽。赶紧格了装 ubuntu 。

显卡是 Intel GMA500 ,这块显卡其实跟 Intel GMA 9 系列是不同的。据说是 Intel 买的 Power VR 的卡。所以要安装 psb 的驱动。Ubuntu 9.04 以后都可以用 apt 装了。不过用默认安装会启动不了 X 。错误信息显示 could not mmap framebuffer 。

google 了一下,某人建议在内核启动的时候留出空间,在 grub 的启动项后面加上 mem=1500m 就能搞定。

Ubuntu 上的这个显卡驱动很神奇,居然支持到 OpenGL 2.0 标准。虽然性能非常差,但也可以跑的起我们的 3d engine 了。反之,在 Windows 下,Intel 官方驱动则没有支持 OpenGL 的额外支持 :( 。

Ubuntu 下的声卡驱动有点小问题,mic 不能工作,需要自己再调整。我暂时没有精力折腾这个。

不过,系统带了个 InstantOn 系统,就是传说中的即时开机 XMB 系统,类似 PSP 。其实这个玩意就是一定制版 Linux 。XMB 下的 SkyPe 是可以直接用的,说明声卡一切正常。

跑到 Ubuntu 下,去看那几个 InstantOn 下的文件,大多数都是 ext2 文件系统文件。可以 mount 上去围观。本来想找找有没有声卡显卡的驱动可以抠出来用,可耻的失败鸟。连个配置文件都没看到。/etc 也不知道藏在了哪里。


由于要用网银,只好再装了 Windows XP 。Sony 官方只提供 Vista 驱动,让我好一阵折腾。最麻烦的是 WWLAN 的驱动安装。

暂时我还用不上 WWLAN ,但是想试一下 GPS 。这个本用的 Option GTM382 的芯片。GPS 只是一附加功能。好不容易安装上 XP 版的驱动(在 Option 网站上可以找到,如果找不到可以 google 出来),XP 版的设置软件没有 GPS 的开启开关。

经研究,只需要把 WWLAN 打开,然后在设备管理器中就能发现新的串口设备。其中就有一 GPS 数据端口,和一个 GPS 控制端口。

根据 Option 网站查到的 AT 指令集资料。用一终端( Windows 下推荐 Tutty )连上,可以用 ATI 查询信息,一切正常。而后可以用 AT_OGPS=2 打开 GPS 。之后,无论 freeGPS earthBridge GPSGate 等等这些 gps 软件都可以正常使用了。用终端自行连接到 GPS 数据端口也能看到收到的 GPS 数据。


HSDPA 功能刚买来时是被锁起的。如果想在国内用(只能找联通),需要解锁。我用的 DC Unlocker 来干这事。消耗了 15 欧元。用 paypal 支付的。我的人品最近衰到了极点,把钱打过去后,硬是没收到 DC Unlocker 网站的 unblock link ,一直登陆不上。由于是在周末,他们客服直到周一下午才帮我手工解封帐号。

unlock 的过程倒是非常顺利。几秒钟就安全搞定。我没有联通的 sim 卡,试了下移动的。用 DC Unlocker 打开 all bounds 后,可以使用 GRPS 连接。很顺利就连上了 EDGE 网络。

今天去公司对面的联通营业厅,想办个最便宜的 3G 业务。又一次可耻的失败鸟。昨天网上查到的 80 元/月 他们那还没有开展 :( ,被告之,过几天再打 10010 问一下。我平时也就周末有机会在家上上网,还只是看看 google reader ,update 一下代码,或者维护一下服务器,怎么看也用不了更多的流量。我还是老实用移动的 EDGE 吧。


最后,如果想玩 wifi 的注入(aircrack-ng)。这个本带的 WLAN 网卡比较新(Atheros 928X)。Ubuntu 9.04 下默认安装的 ath9k 的驱动有问题。一注入就会死机。自己去 checkout 一份最新的代码自己编译就一切正常了。我想等到 9.10 更新也是可以的。不需要额外打补丁。

电池仓里贴的 15 位数字不是 IMEI 码,因为在 Option 网站输入说找不到。用 Dc Unloker 可以查到正确的 IMEI 。

September 10, 2009

《银河竞逐》第二扩充《叛军对帝国》入手

本计划今天继续昨天写关于游戏动作控制的话题的。但就在中午,盼望了一年的《叛军对帝国》到了。

虽然前段已经让同事从美国带一套回来,结果 taobao 上先有了,等不急买了一套。规则早就在网上观摩了手册,所以很快就进入了状态。晚上一下班就开了两局。

RFTG 绝对是个慢热型的游戏,但是玩进去就会爱不释手。它满足我对好游戏的大部分定义。规则清晰平衡,易学难精掌握;策略繁杂有深度,提供的选择多;废物时间少;总游戏时间适当,适合随时开展。

比较难得的是,RFTG 的两个扩充包,打开后都不需要太多时间就能上手。几乎不需要看说明书,拿到卡看看图标和简单说明即可。可是上次和这次的扩充都使游戏进程大为改观,颠覆了许多旧玩法。

这次重点加的是基于战争的对抗。第一局,大家都迫不及待的打军事,想体验一下。我命不好,一开始的牌不适合发展军事,就很悲剧的一个人走和平发展。由于很难借到别人的东风,打的很艰苦。什么事情都是靠自己干。到结束的时候,比别人少了 3,4 个星球。

不过很奇迹的是,得分居然排在第二,距第一只差 4 分,而且,如果最后多有一张手牌的话,就可以在终轮翻盘。最后点分的时候,所有人都不太相信,复查了两次。

这足可以说明 RFTG 玩法的多样性。

玩下来感觉,take over (攻打星球)规则更多的是起到威慑作用,最终发生战争的次数不会太多。大部分时间其实都在在冷战的。不过由于迫使大家更关注对手,无形中增加了相当多的互动性。当然,即使是原版规则,对于老手,互动性也是很强的。只不过新手不太容易体会到罢了。尤其是组牌模式,策略和对抗在出牌之前就开始了。这次第二扩充把组牌模式扩展到 5 人,实在是适合多个喜爱深度策略游戏的玩家。


游戏作者在上一版中留下的一些元素,这次都爆发了。比如基因和外星系都能组出超级好牌。军事就更不用说了。这次又留下了一些还没有作用的符号,要等着第三扩充来揭示。相信不会让玩家失望。相比较现在国产网游,策划们只会一味的复制相同的游戏概念和规则。我们的设计人员缺少的应该不仅仅是想象力。


btw, 我们最近还在跑团。虽然我几年前就想玩,而且早就买了手册和骰子。就是一直找不到机会。这次,我们一群新手终于开始组团了。我连跑团的经验都没有就直接做了 DM ,带了两次团后感觉还凑合。只要大家都有足够的耐心(由于不熟悉规则,花了超过 6 小时做人物卡),还是能玩下去的。有机会再写写我们这个菜鸟团的神奇经历。

September 09, 2009

游戏动作感设计初探

最近两年似乎大家一致的想把网络游戏向所谓动作感、打击感的这个方面推进。我想是因为,已经有太多人厌倦了打木桩吧。

我们在三年前就一直在考虑这个问题,但似乎走向了歧路。一个劲的考虑如何解决网络同步问题,怎样在一定网络延迟下保持公平,怎样避免作弊……

结果,尝试了多次后的结论就是,我们依然没有找到正确的方法解决以上问题,暂时把这一块搁置起来。最近,公司又有许多同事热切希望给游戏加入更多的操作感。我们又重拾这个课题。这次,换了个角度看这个问题:假设我们完全不考虑网络这个因素,就算做单机游戏,我们其实也没有太多动作游戏的设计实现经验。那么首先要解决的是如何把游戏的操作手感做出来,之后才应该考虑怎样在网络环境下实现它们。

为此,我纠结了很久。花了很长时间思考,以及编写了大量的代码印证,总算感觉自己的思路稍微清晰了一点。做一下记录,不一定正确,只是写出来或许可以给其他同僚提供一些思路。在内部讨论的过程中,这些也被广泛的质疑,许多人都不太认同。所以,一家之言,辜枉看之。


首先,所谓好的操作感打击感,和显示引擎的关系并不那么密切。如果指望引入物理碰撞系统、布娃娃系统、更好的动作融合模块,就可以一劳永逸的解决问题。让人物格斗以真实物理公式去运作,就能够给玩家爽快的体验,我认为不是正确的解决之道。

从最强调操作感的格斗类游戏来看,玩家的对抗运算,从来都不是建立在所谓物理碰撞等这些系统之上的。从格斗游戏的开山之作街头霸王,大学里,我们寝室间最为流行的真侍魂,到我最喜爱的 VF ,都有简单且严格的游戏规则。设计人员在那些基本规则上建立起平衡的游戏。前段时间我在 google reader 上[读到一篇文章《從快打旋風談格鬥戲》,深以为然。

第二,做为需要操作感的游戏,一定是主要由游戏内在逻辑去驱动动画,而不是由动画驱动逻辑。所以不应该过于依赖画面最终的表现来做任何判定和处理。在以往的回合制游戏中,由于不强调操作,而偏向画面的动作表现,往往在动画数据中插入大量信息(比如关键帧反馈)。这是因为,当我们之关心每个动作的结果时,这样做能减少动作控制和外界的耦合。但,一旦我们希望提供更多的细节控制,即游戏设计的基本元素细于单个完整的格斗动作,再这样做就本末倒置了。

设计人员必定需要把握拆分后的动作片段的细节,才可以掌握最终游戏的平衡。而不是任由美术人员做出华丽的招数,然后根据招数的表现来左右最终的打击判定。

当游戏从 2d 过度到 3d 后,表现力变的更强、灵活度更高,我们的制作人员反而有点束手无策了。不知道该怎么控制 3d 人物动画,还转而去追求所谓物理碰撞等等原本属于渲染的枝节技术,我十分怀疑是否走对了路?当游戏中的动作画面是一帧帧画出来的时候,我们反而可以做出强烈的打击感,这是件没道理的事。看过铁拳、VF 等等 3d 格斗游戏,我们知道,一定是我们没找对方法,而不是 3d 的错。


关于动画动作控制。我曾经在 blog 上探讨过一次。实践过程中,由于设计依旧不够简洁,我们在互动性强的游戏中,去掉了引导动作的设计(因为本来就要做仔细的控制)。复杂的动作片段组合,用有限状态机来实现最好。状态机使得分片的代码可以分开来写,减少了耦合。并且,状态机是用纯数据表达的。如果条件成熟,还可以设计一种 DSL 来描述。不过在研究阶段,我们并没有完全肯定最终怎样表达最好,暂时我是用 lua 的表来描述的。这块数据可以根据游戏的具体动作设计来独立修改,能够交给非专业程序设计人员协同维护。这也使得单一程序源文件不至于过大。(流程数据化后,让数据和算法分离)

状态机的好处还在于,提高了动作控制模块的健壮性。让一些非法的状态切换很早就可以检测出来。减少把代码写成一锅粥的可能性。

比较难处理的是动作中的互动元素。即攻击者和受击者的动作配合问题。这部分逻辑,由攻击者对象管理或受击者对象管理都不自然。比较容易想到的是提到第三个独立模块去处理。另外,3d 或所谓 2.5D (我不喜欢这个不严谨的词) 游戏中,不同于格斗游戏的是,存在多打一的情况。不确定性更多。这些难点,我经过一些思考后,得到的方案是这样:

先抽象出“冲突(Clash)”这个最小战斗单元。一个“冲突”被定义成一对一的一个招式。一个冲突中一定存在一个且只有一个攻击者和一个防御者。冲突过程中,双方总是趋向于面对面,即处于一个一维空间(如果有跳跃的设定,则是 2D 空间)。在这个冲突空间中,双方能做的主要动作是前进和后退。这个前进和后退都可以是主动完成或被动完成的。冲突本身会因为招式,迫使双方保持在合适的距离。因为只有距离合理,才能更真切的表达出打击感。因为保持距离的需求,大多数情况下会逼迫防守者后退。冲突模块同时会不断的督促参与者调整自己的面向,保持正确的冲突空间。

每场局部战斗,在时间轴上都由多场冲突构成。在动作表现上,每个对象只能同时存在于一个冲突中(逻辑上,它还是可以受到多方面而来的伤害)。只有退出一个冲突,才能进入下一个冲突。每个冲突中,只要有一方宣布退出,那么冲突就结束。

最终,我们实现了一个冲突管理器,称为战场。以冲突的固定心跳频率(略低于游戏逻辑)来更新。每次更新时,会根据每个对象实体发出的消息请求以及优先级,来最终配对,构成一场场冲突,逐个处理。

细节不再展开。下面再谈另一个问题。

动作游戏中,我们不再简单的处理人物的位置。允许他们重合站在一个点上。因为位置对动作性非常重要。但是我个人比较排斥所谓堵门的设定。我希望更自然的处理游戏世界中碰撞的问题。

当然,我不会采用任何的所谓物理系统,(物理碰撞系统可以加入游戏,但不是在这里加入)。作为游戏设计者和实现者,我认为无此必要,甚至会画蛇添足。它让我不太容易把握游戏的平衡。我简单的把规则定为:允许对象的坐标重合,但是如有可能,它们都趋向于保持距离。结合上面提过的设定,再加另一条原则:游戏世界的每个对象都尽力完成自己应该做的事情,让这个世界趋向合理。比如:我被人击中会硬直一段时间,或是需要后退。这并不是攻击方强加给我的,而是通过冲突模块建议给我,以及动作控制的状态机建议给我的。然后我尽量按照建议来行动。作为游戏对象,一切事情都是主动完成,不分主动被动。

对象一个游戏对象,它的行动来源可以来至自身的状态机运转、来至于战场模块,来至于环境障碍,来至于环境的位置管理器。最终在一起决策,做出合理的行为。

至于 PC 和 NPC 的区别,仅在于外部对状态机的输入是 AI 还是控制器。


在实现这些东西的时候,我发现虽然我把事情分成了许多小模块逐个实现。但是我一开始并不能把握所有的需求(应该是因为我没有此类游戏的制作经验)。所以无法一开始就设计好全部接口。也不容易分工给不同的同事一起来做实现。

所以我选择了一种方案,每个模块间都采用消息通讯的机制。并且异步的处理消息。每个模块都认为外部有可能发生一些不合理的事情,而被允许过滤掉一些消息。同时也会认为自己提交的请求会被拒绝受理。这样,单独编写模块会相对容易。这个思路来至于 Erlang 对我的影响。

异步处理的必要性还在于,有许多事件虽然先后到达,但逻辑上需要相互决策。当我们解开小模块间的耦合,就失去了调整模块运作的先后次序的机会。这样,我们只好再把逻辑处理划分成时间片,让每个时间片的事件可以放在一起做一个协调。同时对象需要根据不断的状态变化,对自己的行为做一个反馈。(所以,我在实现冲突中被击打者后退的动作时,并没有由冲突模块准确发送应该后退多少,而是简单的发送一个“后退”消息,由持续不断的反馈机制来做到最终需要的效果)

除了消息传递这个基本机制,我还给整个系统增加了另一个基本元素。被称为探测器(Detector) ,这个东西用来取代直接向对象索取数据。比如,我可以创建出一个对象位置的探测器,从中拿到对象在世界中的坐标。这个间接层我还没有找到足够的理由说明它和直接获得对象属性的区别和好处。但是直觉暂时告诉我,是有必要的。因为在现实中,我们了解到外部的一切都来至于我们的感官感受到的东西。也就是说,我们看到的东西仅仅是外部世界在视网膜上的图象投影,并不是外部世界的本质。Detector 就是模拟的这一点。

在模块划分上,对于这些不确定的需求,我倾向于按功能划分模块,而不是对象的实体。倾向于用非侵入式的方式扩展功能,而不是在一个类上不段的增加代码。比如,消息通讯对象就不是放在需要收发消息的对象内部的,而是独立出来,由对象自己去从通讯模块中找到属于自己的接口。因为我不希望有一个类不断的增加成员数据,庞大到不可收拾的地步。而且,在执行次序上,我更希望按功能去统一处理:形象点说,我希望处理完所有对象的视觉信号后,再处理所有对象的行动。把对象的视觉模块放在一起管理,可以更方便的做到这点。


写了好多,似乎还是谈的太泛泛。一是思考了很久,想的东西太多,写的程序也很多,不是几千字能写完的。二是,的确也没有考虑全所有的细节。

如果明天还有兴致,我会继续写。