« January 2008 | Main | March 2008 »

February 25, 2008

显卡还是 N 卡好啊

新来了个同事,用 Linux 做桌面的。这样也好,可以节省一套 Windows 的费用。买组装机即可,同样价钱可以比 DELL 的配置好上许多。

昨天装的机器,一开始遇到点小麻烦,Ubuntu 7.10 对板载网卡 RTL8111/8168B 支持有问题。显示是安装一切正常,但是就是网络不通。ip 包发出去似乎就消失了,收不到回应。奇怪的是,Ubuntu 7.04 下却一切正常。google 上没有找到解决方案,也懒得细查,抽屉里翻出块更老的网卡装上。btw, 上次装 Solaris 10 ,这块板载网卡也是不认的。

接下来是显卡的问题,板载的 Intel 945 的显式芯片,按道理 3d 性能还是不错的。可惜 3d 这部分,一半靠硬件,一半靠软件(驱动)。怎么折腾都没找到 Ubuntu 下的对应驱动。

Intel 的官方搜索 倒是找到一些似乎是提供给 Linux 的驱动,可那些是供 Red Hat 用的。Ubuntu 系统默认安装的是 Mesa 的 GL 驱动,对于现代 3d engine 来说,基本上啥都没实现(连 S3TC 压缩贴图的扩展都没有)。

这让我无限怀念 N 卡。

不说别的,就说人家 N 卡的人做软件的态度。各种平台的驱动一应具全。freeBSD 下,N 卡官方提供的驱动几乎是唯一完美支持 openGL 的。连 ports 里都是单独一支:放在 /usr/ports/x11/nvidia-driver 下。而别的厂商的显卡驱动则均无官方版本,挤在 /usr/ports/x11-drivers 里面。

A 卡则次点,不过还好,除了 Windows 驱动外,倒是给出了 linux 版的。不过我老是觉得 ati 被 amd 收购后,越来越不思进取了。市场份额越来越小

我们维护 3d engine 部分的同事对比两类显卡的驱动,举了个很有力的例子用来说明开发人员会更喜爱哪家公司:

A 卡每次发布新版驱动,都会在更新文档里列出,我们这次更新修复了哪些游戏中因驱动引起的 bug ;而 N 卡发布驱动新版本,更新文档则是列出针对哪个接口做了怎样的改进或修正。

嗯,我就不谈 Intel 的卡了,虽然它的市场占有率也不低。可恨的是,Intel 可以为 Mac OS 做出漂亮的驱动来,就是不给开源社区贡献一点东西。原本把 Intel 和 AMD 相比的时候,我还有无限好感(来源于我们可以免费从 Intel 开发网站上免费索取到详尽的开发文档,并在一周内从美国快递过来);在显卡驱动这块,好感立刻减了一半。

如果你是一个 3d 游戏开发人员,请选购 N 卡吧,因为它对开发人员的诚意。

如果你是一个 3d 游戏玩家,也请选购 N 卡,因为为你开发游戏的程序员都喜欢它。

February 19, 2008

角色动作控制接口的设计

最近一段时间工作的侧重点转移,我从服务器的设计转到客户端这边来。

自从最底层引擎的架构完成后,我们的客户端留了两个人在全职写代码,一个人负责 C 层面的 3d engine ,另一个人负责设计高层面的应用接口,并在此基础上完成游戏 demo 。

从程序员角度上看,人都是相当不错的。要设计有设计能力,有编码有编码能力。代码审美观上大家也很一致,所以我们几个人一起工作的很愉快。

唯一美中不足的是,做 demo 的程序员游戏接触的太少,所以在操作手感调整方面有点相形见绌。需要经常性的跟负责战斗动作系统的策划沟通调整。而策划毕竟不太明白程序背后再用怎样的方法实现,最终还是有点不尽人意。如果有足够的时间,倒总是能调整好。不过现在项目进度比原来计划有所提前,我就直接参于进来参合了。加快这方面的开发进度。

上周花了几天时间通读了所有相关的代码,整体设计还是不错的。不过这两天用下来,还是觉得有点别扭。

我希望游戏能有比较流畅的操作感,可以灵活的操作游戏角色做出各种动作,包括战斗时的腾挪,组合技能等。写了不少脏代码尝试我希望的手感时,终于发现一些设计问题了。

所谓操作手感,其实不仅仅在于对输入设备的控制。它包括输入设备(键盘鼠标)的数据采集分析和输出设备(显示器)做的视觉反馈。希望获得良好的手感,就一定要准确的控制每个动作的视觉反馈。

这里,3d engine 的角色动作控制接口设计就很重要。需要做的简单易用,又能保持健壮。

其实到了这个层面,已经不关乎 engine 是 2d 还是 3d 的事了。只是 3d 在精灵的空间位置和摄象机的控制上,比 2d 多出一个自由度来,运用要复杂很多。保持接口简洁就更为困难了。

今天暂时先谈谈简单的部分,如何控制角色的动作播放。(2d engine 也用的到)

本质上,图象 engine 是一帧帧渲染角色精灵的。渲染这个操作必须被隐藏起来为应用层不可见。3d engine 有更高的表现力,比如可以做骨骼动画,以此做动作间融合。这些应该归到渲染层面做。绝大多数情况下,应用层不应该关心。

以前,我们的引擎接口提供了方法设置角色当前应该播放的动画系列。其参数有播放指定次数还是循环播放。仔细考虑,其实不太合理。

实际应用中,将角色动画播放指定次数完成后,引擎应该做什么?让精灵的画面停留在最后一帧吗?显然是不合理的。如果精灵全部是模拟的活物的话,正常状态下它们永远都应该在运动。

接口设计的健壮性应在于,我们无论怎样调用,都不应出现错误的状态。角色的画面静止就是这样一种错误状态。

我曾经想实现一个很复杂的动画序列驱动引擎,相信很多人也干过。就是在引擎中支持播放一个列表的动画序列,并可以为每个节点附加控制器,决定是反复播放还是单次播放。并让控制器可以控制角色的内部属性。甚至这个播放列表还可以是树状结构。

这个想法大约在 01 年的时候我曾经实现出来,发现并不好用。它完全违背了 KISS 原则。越是将功能做的全面,就越难二次扩展。用它的程序员也很难控制内部细节。(btw, 我在去年初放弃 boost jam 而换用 gmake 做 build tool 也是因为类似的理由)

如果真正的考虑,其实我们所有需要控制的角色动画其实都可以分解成这样一种元动画:即一组循环动画前置一个进入这个动画的引导动画序列。比如坐下,就是从直立状态经历一个坐下的过程,最终让角色一直持续在坐着的状态。又比如人物站立时,做一些花哨的手势,也应在完成之后,又恢复成普通的站立形态。

至于前导动画系列怎么和之前的角色状态衔接,我们可以交给引擎的底层考虑。而一切复杂动作皆可被如上分解。及时有一些特例,也可以做一些变通。比如最终的循环播放阶段可以只有一帧,那么角色就静止在那里了。

如此设计,我们并不需要让引擎提供接口去控制一组动画需要播放一次还是多次,或是不停播放下去。对一个动画元组永远都只有一个播放指令。

那么,交互式的动画如何控制?

这需要增加一个调用参数。虽然,一组动画总可以无限播放,但引导这段动画的前序动作却只有一次。使用回调函数的设计是很难看的。比较漂亮的方法是可以指定前序动作的时间长度。因为这个时间往往跟逻辑紧密相关,比如挥刀劈砍,完成整个动作的时间需要程序控制精准,而不能由着美术人员制作。许多动作的播放时间长度都会随着游戏开发不断调整,我们不可能每次调整都去要求美术人员改变。所以引擎应该内部支持动画序列的播放时长,按程序运行时参数要求拉伸或压缩。

对于循环播放的动画有时也有必要精确控制每个循环的时长。最典型的例子是跑步动画。当我们设定为角色一秒跑动两步跨过 10 米时,就需要精确控制 0.5 秒播放一个跑步循环。这样的控制可以避免视觉上感觉角色在虚拟世界的地面上滑动。

总的来说,游戏逻辑应该和画面脱离。时间控制是放在逻辑上的,而画面表现则配合逻辑实现。

February 17, 2008

键盘毕竟不是手柄

周末在写 demo ,为了给同事示范我希望得到的操作手感。作为一个能写点程序的游戏设计者,自己随时实现出来看看恐怕是不可多得的优势了。

我们的游戏有一定的动作成分在里面,所以我不想采用鼠标控制角色的行动,以对拍砖头的形式表现格斗场面。本质上我更偏好 console game 和游戏手柄的操作感。不过在 PC 平台上,手柄并不普及,只能在最普及的输入设备——键盘和鼠标上下点工夫了。

手柄控制方向主要有两种:

其一是模拟杆,在 PSP ,PS ,Wii 等手柄上均有安装。好处是至少可以感知两级力度,并可提供非常细的方向信息输入。控制游戏角色行动时,操作感很不错。

鼠标通过移动可以提供方向信息,甚至通过移动速度可以模拟出力度的差别。但毕竟鼠标缺乏力的反馈,且必须通过移动才能提供信息,本身不能保留状态(鼠标的 button 可以提供状态,所以很多 fps 把前进操作设置在鼠标的按键上),和手柄的感觉还是差了很远。

btw, IBM 的 TrackPoint 如果特别针对去开发,其实是个不错的游戏输入设备,可惜还是太专有化了。

其二,就是类似任天堂的十字键。由于有专利,到别的厂家那里换成了其它形式,不过大体还是差不多的。这类设备可以精确的输入八个方向,在格斗游戏中用的最多。比如我的最爱 VF4 EVO 的 PS2 版,干脆就禁止了模拟杆的输入,只允许用八方向键。

对应到 PC 上,大多数游戏用 WASD 四个按键模拟这个设备。不过要小心的是,由于键盘硬件设计的缘故,大多数键盘处理三个以上按键同时按下时,会发生所谓锁键问题。比如我的 DELL 键盘,同时按下 W 和 D 键后,再按 E 键,系统就接收不到 E 键的消息。这类情况试硬件决定,不同键盘处理能力不同。据说有比较强悍的键盘可以处理任意 7 个按键同时按下的消息,我就没有试过了。

好在现在的键盘处理两个按键的能力还是绰绰有余的,用 WASD 模拟八个方向的输入足够了。


游戏和普通应用软件是不同的。道理大家都明白,但是很少人仔细考虑。虽然游戏依旧是程序,只需要人来提供输入(鼠标键盘的控制),软件提供输入(明白显示)。但是,我们不能忽略人。人在游戏时是系统的一部分,我们提供的输入不仅仅是数据信号,而是恰当的时机提供的恰当的数据序列。这也是我反复强调过的,时间因素在游戏软件中的重要性。

普通的 OS 并不是为游戏设计的,输入设备的界面能获得的仅仅是数据而已,而缺乏时间上的控制(需要我们在应用层上额外编写代码实现)。当然也不绝对是这样:比如 Windows 可以在 OS 级处理双击消息就是一个例外。

console 平台上,也能看到双击这种操作。许多动作游戏把双击前进设定为跑步或冲锋。不仅如此,我们还能找到操作跟时间相关的很多例子。比如在许多游戏里,长按和短击按钮往往是有区别的。例如在 PSP 版《怪物猎人》中,短击 L 键是切换镜头,而长按 L 键则和镜头控制完全没关系,变成了切换物品。

操作手感是许多种类游戏的灵魂所在,如果你不同意这点,也该看看 Wii 和 NDS 是怎样改变游戏机市场的格局的。当然我们也不必过于埋怨 PC 的输入设备的落后,很多情况只是做游戏软件的态度。许多游戏之外的软件其实已经做了许多,比如我最爱的浏览器 Opera ,让我钟情于它的就有方便的鼠标手势。好好想想,键盘鼠标上都可以做许多文章呢。


下面写写周末做的一些工作和想法,做个记录:

当我们用 WASD 来模拟八方向键时,会遇到一些问题。

通常,我们有两键同时按下来模拟斜向的方向。比如 W 和 D 一起按下,相当于右上。可问题在于,“同时”这个概念本身就不存在。莫说人不可能同时做到把两个按键“同时”按下;实际上 OS 提交的键盘输入数据里 W 和 D 键总有个先后到达。

如果这个问题还不足以引起你的注意,那么看下一个:如果我们同时按下了 A 键及 D 键,逻辑上应该如何处理?在游戏手柄上我们永远无法同时触发左方向和右方向,但是键盘上却可以轻易做到。

最终,我是这样做的。

我们必须记录所有按键的先后次序,并保留每个按键的状态(是按下还是松开)。用一个队列来记录按键次序,每次一个新的方向键(WASD 四个键中的一个)按下,都把这个键放到队列的顶端。然后依次检查队列,查找是否有关联键存在。所谓关联键,就是可以与当前按键发生联动的按键。比如 W 键可以和 A 键或 D 键联动。由于一个键可能和多个键联动,那么,就应该按按键次序来处理,只保留最近的一次联动。

当接收到按键送开的消息时,遍历队列,将相关的所有按键及按键组合去掉。

程序从队列顶端拿到当前的按键或按键组合信息。

这个设计保证了所谓格斗游戏的键盘划弧的正确性,当你依次按下了左(A)和下(S)后,继续按右(D)键时。如果没有即使松开左键,导致三键同时按下,我们可以取到最自然的逻辑:右下(下和右联动)而忽略掉多余的按键“左”。当我们按住左和下,同时点击右键(注意:这种操作输入三键同时触发,不是所有键盘所有按键组合都可以正确处理)时,也可以有自然的视觉反馈:它相当于在右下和左下两个方向间切换。

此外,我还做了另一些尝试。

键盘无法做到手柄那样识别力度,那么我们只能从时间控制上做点文章。比如,我们可以区分按键的快速击打与长时间压放。并能够记录指令的次序。

例如,可以将长压 W 来控制角色前进。如果在前进的过程中按 S 的话,则可以认为是后退。但若立刻松开 W 这个前进按纽则认为是要做转身向后的动作。如果只是在前进过程中速击 S 后退键,又可以认为是闪避。仅仅只是两个按键,通过不同的时序组合却可以做出三种以上的动作来。

好好挖掘的话,键盘甚至可以做出比手柄更灵活操作方式。不要把键盘上的键看作一个个独立的按键,而应去想象五根手指的运动(暂且认为另一支手要握着鼠标),我想能发现更多。

切莫以为设计的复杂会给最终用户带来困扰。用四个键去控制八个方向,比设定八个(甚至更多)方向键在很多环境下要更体贴。毕竟人只有五根手指,通常我们只使用其中的三根操作方向键。用户比你想象的善于学习,只要给他们的操作提供足够的视觉反馈,并且让所有的操作都有最自然的含义,而非惊奇。这样,用户在学习操作的过程中就不会有太多的记忆负担,乐于接受。


最后谈谈鼠标。

不知道有多少人记得很多年前的《刀剑封魔录》,不知道它是否借鉴了 Opera 中的鼠标手势,用鼠标划大招的设计终归是很不错的。可惜制作组去了搜狐后没有在游戏的操作感上继续挖掘下去。

我们总觉得鼠标是一个 2D 定位设备,操作系统总能提供鼠标光标的绝对坐标。但实际上,鼠标本质上只能提供相对运动信息。就好比 Wii 的手柄,它提供的仅仅是你挥动它的加速度,并不能感知手柄在空间中的移动速度。是 OS 提供的编程接口误导了程序员。我们要挖掘鼠标作为游戏输入设备的能力,就要先看清这个本质。

用鼠标画过图的人应该有体会,就算是画个简单的圆,不借助软件工具也是很困难的。甚至远不如笔方便。我想拿是因为,手握着笔时,是用三跟手指在控制,可以做出精细的角速度变化。而捏着鼠标则是用手腕,手腕能提供的移动的直线速度控制。也可以做到较为精确的平面定位。但不容易把握角速度。而可惜的是,鼠标本身并不能获得绝对坐标。我们用鼠标操作 FPS 游戏时,也多利用的是直线上速度控制这一点。

我们采集鼠标的输入数据时,就不可以孤立的记录每次的运动绝对方向。要知道短时间内,两次方向数据即使有区别,那很可能是人手腕的局限性造成的。足够可信的数据是鼠标在短期内速度方向的大幅度改变,例如逆向移动,和顺/逆时针切向运动。大体上,我们能采信的角度改变只此三个状态而已,而不能把角速度作为线性变化的输入数据来看待。

但另一方面,鼠标线速度的区别则可以相对可信一些。不少台球游戏用它来控制出杆力度,玩家经过适应后可以获得不错的手感。

今天累了,不往下写了。

February 14, 2008

没有情人的情人节

祝天下人今天快乐。

其实我不想以讹传讹,只是选个浪漫的日子纪念程序员日。还没找到情人的程序员们,不必把计算机当作情人,也应该在今天节日快乐。

最后,说个冷笑话。

相信爱情。

真的。

February 07, 2008

春运

回家有几天了,特别忙,就没心思写东西。今天初一了,坐下来想想往回赶的那两天的经历,心有余悸。

今年南方遭遇雪灾,恰巧赶在春运,这天灾也就抵不上人祸的威力了。当然不是说年跟前往家赶的人们有什么不对,只是想说这人的因素才是混乱的根源。

这次公司提前放了假,我三号下午就启程回家。那天大雪已经停了,驾车去机场的路上都还顺利。稍稍有点堵车,不过路面的积雪清理的很干净。出了太阳,有同事送我,帮我把车开回去。心情很不错。

到了机场一看,倒吸一口凉气。怎么像火车站似的,人山人海。不少人席地而坐,地上满是垃圾。站着的人拥挤在候机大厅里,朔大的电子公告牌上一片红色,似乎所有的航班都 delay 了,另有几班被取消的。

原来前两天因为大雪封了机场,滞留了两天的人全堆在这里。机场的管理者显然没见过这阵仗,不知道该怎么处理。毕竟跟火车站不同,往年即使是春运期间,这里也是有条不紊的。我想,这样的混乱,也是头一回吧。

情形也是预料之中的,所以我特地提前了两小时到,希望能早点办出登机牌。可到了 check-in 的柜台区一看,几乎没有可以落脚的地方。一队武警刚到,正在列队,他们的头儿吩咐了些什么,然后就散开去了。

从外面看不到值机柜台里的情况,我努力分辨着队尾,想排入队伍。人们喧闹着,不时的有人喊着口号,某某的人们要回家之类的。我猜想那是被取消航班的人群。可不久就发现这是一个错误的判断。

广播响了,先是让去武汉的人去 29 号柜台办手续。而后有领导开始解释,据说机场已经停有30余架飞机,但无法起飞。不是因为天气原因,而是没有足够的人可以按时办到登机牌。飞机不可能放弃旅客空载起飞。

按程序员的思维来说,就是资源发生死锁。

大家都拥挤在值机柜台前的那块不大的区域里,被挤在前列的人们没有轮到他们的航班,而不能办理手续。正在值机航班的乘客去不到柜台前办理手续登机。机场上空等着多架飞机无法离港。后面的飞机无法降落。

结果是人在大厅也无法动弹,飞机在停机坪也无法动弹。乘客不断的来到使不大的空间更为拥挤,航班随着时间的推移越来越无法排出时间表来。

我站在外围突然觉得很好笑,其实理论上并不是个特别复杂的问题,可一涉及人,就变的无法解决了。情况其实也不是特别糟糕,无意识的人们几乎都保持着他们的修养和礼貌,至少我转了几圈甚至连语言冲突都没看见。警察和武警们也很认真的维持着秩序,他们的脸上似乎还带着笑容。说话的语气都很平和。过年了,大家心情都不错,没有人觉得面临的是一个无法解决的问题。

我想了想,问题的关键在于值机柜台前的秩序。如果人少一些,大家看的见队伍,也就会排好队依次办理手续。可当队伍以前消失了后,后来的人出于他个人的理性就无法自发的组织起队伍来了。结果里三层外三层的把人围了起来。不仅外面的人进不去,里面的人也出不来。里面还有许多人带着大箱大箱的行李,更是无法动弹。

这种困境在《微观动机与宏观行为》中反复提到过。典型的公地问题。如果大家都能退让出一些空间出来,那么所有人都可以获得很大的收益。其实甚至不需要一个队伍,只需要留有一条通道供前面的人退出,大家的困境就解决了。

站在我附近的几个中年人对着旁边的警察抱怨着,让他们想办法组织起人墙把人隔离开来,不让后来的人进来。可那其实不是个根本的解决方案,而且也并不可行。当时的问题是,柜台前已没有人可以挤到前面办业务,而跟前的人又无法出来。外面是一个敞开的空间,用人力挡住外围的人,只会随着后来的人到来越来越困难。

我看了下四周的情况,依稀分辨出两个柜台的人群的分界线,由于挤的太厉害已经处于静止的状态了。而我的旁边有一堵墙,似乎墙角一片不大的区域稍微稀松一点,不断的有人从这里挤到里面去。我能站在这里并不是偶然。主要是因为我已不打算向里面挤了,这里稍微宽敞一点刚好歇脚。像我这样没有进取心的家伙很自然的就停到了这里。

这个时候,我对短时间拿到登机牌已经不抱啥希望了。随即拍了拍身边的警察说,大哥,您别挤来挤去了。我看这个地方挺好,你站在这不要再让人过了才是眼下要做的事,我帮你一起弄。

而后,我开始吼叫着让前面的人把大件的行李传出来。身边的人不是很理解,尤其是那几个中年的人们,冷眼看着。嘴里奚落着机场管理者们的无能,或是训斥着身边的警察,让他们找领导来。又或是偷偷的想让他们利用身份挤到前面去代办一下手续。我心中苦笑着,原来最后还是想着自己啊。想着自己倒是没什么错,错就错在,当每个人都企图用伤害别人的手法维护自己的利益时,整个群体都被伤害了。

过了不久,有三四个年轻人理解了我的做法。或是他们也想到了。我们开始从里向外传行李,把大件的行李堆在外围一起。我从头顶大约运了二十多个箱子后,感觉周围宽松了一些。一些人也挤出来了,有人办到了票,有人把证件委托给其他人自己出来了。由于周围松动了,警察也多了几个。毕竟挤在人群里的滋味不好受。其间还有三个晕倒的人被架了出来,据说他们已经在里面站了六七个小时了。我身边还多了个孕妇。

眼看着,一条通道形成了。秩序好了一些。又有许多人从通道挤出来,而我们在通道的末端阻止着新的人进入,而指点他们去更后面排队。显然,新的外围相对宽敞,有更多的人维持秩序,队伍也形成了。

一开始跟我站在一起的人似乎已经排到前面去了。虽然猛的一看,前面还是挤作一团,但我看的久了,似乎也能看出队伍来。时间已经过了四个小时,一个过来换班的警察看见我还在原地很诧异,问了句怎么你还没动?我笑着答,帮帮你们嘛。其实我心理清楚,我站的位置经过几个小时,相对比较重要,如果缺个人坚持在这疏导人群和行李,不要十分钟就会重新变的混乱。我自己是没有什么行李,挤进人群很简单。但那样只会给整个系统添乱。我以这个理由不断的呵斥想往前挤的人,嗓子已经有点哑了。我想我旁边的那个年轻的警察肯定接到过命令,不准对人恶语相向。也的确应该如此,不然激起焦躁的人们的情绪来,就他们那几个人手,场面肯定会失控。我自己倒没有这么多顾虑,毕竟,看,我这也不是急着回家的人么 :D 既然我都牺牲了在这里停着帮大家维持下秩序,你们就没啥好说的了吧。

广播里不停的播放着,某某大领导亲临现场办公。我心里笑着,领导来解决问题倒不是坏事,但是循环广播这条消息顶个鸟用。安稳人心吗?但人群并没有骚动的迹象。亟待解决的并不是安抚人心的问题,而是怎么解开人群位置的死锁。

晚上 9 点,去武汉的航班据说已经都发出去了。武汉的值机柜台前方依然等着上百号人。由于没有航班(机场依然候着许多没有坐满乘客的飞机,补班飞机不能安排),值机手续停了下来。这真是个糟糕的开始。后面的人无法看到前面的消息,怀疑的情绪蔓延开,好不容易宽松下来的环境又开始向前压挤。一开始许多人想去队伍前面看个究竟。空出一大块场地后,安心排队的人也不由自主的向前走。慢慢的我便无法挡住后面的人流。

因为这个时候,机场的管理人员犯了个大错误。

广播里居然让所有去东北的人到原来武汉的值机柜台办理手续。我想是因为看起来这块还比较有条理的缘故吧,而且去武汉的航班也停办手续了。可是他们没有想到,依然有几百人站在这里不肯(不能)离去。不到五分钟,乌压压新来了一大票人,又在外面围了三层。把原本松动的空间压了个严实。

显然这帮新过来的人也无法排到前面去把手续办下来,正是他们自己挤压掉了原本可以通到前方的通道。人流涌来的太快,根本无法作出解释和阻止,结果就已经造成。

又过了一个小时后,我决定放弃一切努力,无论是维持秩序的想法还是办登机牌的尝试。旁边的警察微笑着跟我打招呼。我从人群里出来,进了机场超市。买了一瓶饮料,一盒蛋糕,坐在地上掏出 PSP 看电影。


排队的人的心理其实很简单也很幼稚,幼稚跟年龄无关,跟生活阅历无关,环境使然。

排在前面站了七八个小时的人,即使没有多大希望也不愿意放弃。投入的越多,越希望坚持下去。即使自己的做法对自己的境遇并没有多少改进,于整体只有妨碍。人们只是不愿意承担失败的后果而已。

在失去秩序后,几乎每个人更加不肯放弃自己的有利位置。在无序的环境下,大家都担心别人抢到了本该属于自己的权益。这种时候,人的眼光也变的狭隘和短视。只要眼前有点空间就向前挤,不惜让一条队变两条,两条变四条,直到没有队伍。

一开始的秩序固然重要,我当时听的最多的抱怨就是这个。但是当混乱已成事实后,恢复秩序才是重点要解决的问题。我坐在地板上想了两个小时,假设自己有足够的权利调配可以调配的资源该如何做这件事。最后也没有得到特别好的答案。

能确认的是,第一首要解决是信息如何通畅的传递。

当时机场广播显然没有特别有效的利用,值机柜台上的显示器居然关了好几个。本来那是个发公告的好地方。后来我才知道,似乎是头两条机场关闭导致骚动的人们损坏了部分计算机。不过没利用正常工作的显示器公布信息真是特别的失败。

现场我试过联合几个人传话,但是效果很差。口口相传的语言仅限于简单的词汇,而且有效距离不会太远。写大字报也不是个好方案。

第二,保留资源总是有必要的。比如空出小片场地;留出通道;保留几个值机柜台等等。机场的室外,也应该保留停机位或跑道。

第三,绝对不能期望人的群体能做出理性的集体反应。再聪明的人群集在一起,也会让每个人的判断力都下降到平均水平以下很多。我们只能从简单的机械的方案中去寻找。


后来的故事就是我自己做的些傻事了。

在我吃饱喝足后,就在机场各个柜台瞎转悠。这一天,由于场面混乱,机场急于解决问题,已经是不分航空公司不分航班,只按目的地随便领登机牌了。到了 4 号凌晨总体的人少了一些,但大部分柜台依然拥挤。有些航班可以在几个地方办理,但似乎这个信息并没有传达下去。总有地方排了老长的队,而有的位置可以办手续,但却没几个人。

我开始很无聊的去人少的柜台打听新近准备起飞的航班,以及每个柜台前拥挤的人群想去的位置。然后把排在长队尾的人领到短的队伍那边去。大约弄到一点的时候,武汉的补班航班也到了。很顺利的,我就拿到了登机牌。

通过安检后,找不到登机口。有个机场工作人员说,早着呢,登机口都没排出来。我便找了家咖啡厅休息,点了罐 45 RMB 的雪碧边喝边看 psp 。结果很郁闷了误掉了补班飞机。原因是机场过于混乱而没有广播我那班航班的信息。等再跑出来改签当天更晚的航班却已经全部满员了。结果只到第二天下午才回到家 :(

中间又发生许多事情,比如四号没有了补班飞机,而正班飞机满员。且四号上午大雾,机场不能起降航班等等,那又是另一段故事了。

February 01, 2008

受不了 spam 了

最近一段时间本 blog 的留言 spam 特别多,MT 默认自带的那个 anti-spam 插件不顶用了。今天 google 了一下 MT 插件的大概写法,登陆上服务器用 vi 临时写了个简单的插件。万一过年期间我不能上来清理留言的话,希望这个插件可以阻止 spam 泛滥。

大家这段时间留言时麻烦做一道小学数学题啊 :) 为了防止有读者忘记了怎么计算加法,我把答案也公布在题目后面了,只管照着填。记住要写阿拉伯数字,填汉字数字无效。如果你有注册发言,可以略过这一步。系统会优先承认注册登陆用户的评论。

等过完年再想想换个方法对付 spam ,尽量不降低用户体验。如果找到好方法的话,大家就可以放心订阅留言的 rss 了。

ps. perl 的语法真怪异。