<?xml version="1.0" encoding="gb2312"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>云风的 BLOG</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.codingnow.com/atom.xml" />
   <id>tag:blog.codingnow.com,2008://1</id>
    <link rel="service.post" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1" title="云风的 BLOG" />
    <updated>2008-05-09T18:12:47Z</updated>
    <subtitle>思绪来的快去的也快，偶尔会在这里停留</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.2b5</generator>
 
<entry>
    <title>那些日子（十）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_10.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=366" title="那些日子（十）" />
    <id>tag:blog.codingnow.com,2008://1.366</id>
    
    <published>2008-05-09T15:04:40Z</published>
    <updated>2008-05-09T18:12:47Z</updated>
    
    <summary>2001 年的国内网游市场上涌现了不少的游戏，有些昙花一现，现在估计都没什么人记得了，例如我依稀记得的一款三国题材的游戏，运营没持续多长时间。还有一些一度风靡全国，拥有不少玩家，如《千年》、《红月》、《龙族》等。 《传奇》就是在这个背景下横空出世的。 陈大年是我大学时期结交的网友，跟我一般年纪，我们时常在 icq 上聊天。在我还在读书的时候，他已经辍学闯荡江湖了。他也是个程序员，似乎写 delphi 的，我早年也玩这个。我们那时候共同的爱好是想做游戏。在我还没毕业的时候，他给我看过他的公司做的网站，记得叫归谷，主推一只可爱的漫画狗。小狗叫 stammy 还是 stame 我是记不太清了，投资方有中华网的背景。 大年告诉我他们转做网游的时候，我丝毫不奇怪，游戏这么火，做网络的不做游戏才是奇怪呢。（我想，即使在那个所谓网游起步的时候，看的到网络游戏有赚钱潜力的公司根本算不上有什么独到的眼光，看不出来的没眼光才是）他和他哥哥一起做的公司，据说去韩国找了个小公司谈了个游戏，这个游戏就叫做《传奇》。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>2001 年的国内网游市场上涌现了不少的游戏，有些昙花一现，现在估计都没什么人记得了，例如我依稀记得的一款三国题材的游戏，运营没持续多长时间。还有一些一度风靡全国，拥有不少玩家，如《千年》、《红月》、《龙族》等。</p>

<p>《传奇》就是在这个背景下横空出世的。</p>

<p>陈大年是我大学时期结交的网友，跟我一般年纪，我们时常在 icq 上聊天。在我还在读书的时候，他已经辍学闯荡江湖了。他也是个程序员，似乎写 delphi 的，我早年也玩这个。我们那时候共同的爱好是想做游戏。在我还没毕业的时候，他给我看过他的公司做的网站，记得叫归谷，主推一只可爱的漫画狗。小狗叫 stammy 还是 stame 我是记不太清了，投资方有中华网的背景。</p>

<p>大年告诉我他们转做网游的时候，我丝毫不奇怪，游戏这么火，做网络的不做游戏才是奇怪呢。（我想，即使在那个所谓网游起步的时候，看的到网络游戏有赚钱潜力的公司根本算不上有什么独到的眼光，看不出来的没眼光才是）他和他哥哥一起做的公司，据说去韩国找了个小公司谈了个游戏，这个游戏就叫做《传奇》。</p>
]]>
        <![CDATA[<p>网易的《大话西游》定在了 10 月底上市（一开始大家都没有公测，也就是给大家免费试玩，这个概念），《传奇》也是这个日子左右，稍早一些。</p>

<p>我没有想到《传奇》会在商业上如此的成功，正如陈大年一开始也不会想到《大话西游》的未来。我把《传奇》看作是跟《千年》、《红月》这般的韩国游戏一样，一个普通的产品，没有什么特别之处。</p>

<p>有如网易找到了智冠，盛大也找了上海的育碧做合作发行商。一切都是按惯例循规蹈矩的进行着。《大话西游》正式发行的前几天，大年在 icq 上几次兴奋的告诉我，他们的游戏达到了多少多少人在线了。当然也试探我们的情况，我没有怎么说，因为实在是不好意思讲。</p>

<hr />

<p>《大话西游》发布前，在广州的天河电脑城前办了一个热闹的活动。星爷过来捧场，智冠的老总致辞，好象还有一个广东什么地方的一个牙膏厂老板，不知怎么也混在里面，有些商业上的联系吧。星爷的到来，牙膏厂的老板就被大家起哄哄走了，每人愿意听他讲话，弄了个没趣。不过更没趣的时，不知道公司什么地方没有打点好，活动搞了一半，就有人（城管？）过来拆台。</p>

<p>就是这样，一切就在匆匆忙忙中拉开了帷幕。</p>

<p>正式上线前的那天，几乎所有开发人员都一夜未眠。尤其是程序，还在临时修补着 bug 。玩家在论坛上唾骂着可恶的 cd-key 制度。不管有没有 cd-key 的人都在拼命的下载更新包。当时还没有利用 BT 技术分担带宽。公司几乎把所有的带宽都增援过来用了。</p>

<p>client 最后还有许多已知 bug  没有解决。dingdang 说留到最后吧，到开服务器前再让大家下载最新的 client 执行文件。就这样，已经更新完补丁的玩家，甚至连 client 都不能启动。</p>

<p>拖延了几个小时后，古越说，好了。client 主程序放出。只隔了几分钟，便有玩家涌入。</p>

<p>ten 已经累的不行了，他写了一个监控脚本，当监视到服务器挂掉后，会自动重启服务器。然后就回家睡觉去了，之后是 dingdang ，慢慢的，一个个都走了。我是比较能熬的，不知为啥，选择留在了公司。其实也没太多事情好做，只是刷刷论坛。</p>

<p>没过多久，玩家就集体掉线了。服务器崩溃。不久，自动重启。又过了大约 10 分钟，再次崩溃。就这样一直循环下去。服务器这边的负责人全都回家了，完全无能为力。我实在看不下去了，也只好打车回家做鸵鸟。</p>

<hr />

<p>接下来的几天，无论是 client 还是 server 的程序都不停的加班。问题一个个的解决，又一个个的蹦出新 bug 来。服务器稍稍稳定一点后，客户端又不断的报错。其中跟我有关的，是一个声音播放模块的问题，又是多线程惹的祸。</p>

<p>我们的这第一版 client  ，居然使用了多达 4 条线程，地图处理、逻辑处理、网络处理、声音处理，大家又没有多少多线程编程的经验，一不小心就犯错误。好在底层的问题查起来容易，解决起来也快。可逻辑层面上的东西就没那么容易搞定了，古越压力很大，总看他在那里调程序，仿佛永远也做不完。</p>

<p>另外，用户的浏览器 IE 的版本千奇百怪，小版本的区别很多。不知道为什么，我们的 UI （借助 IE 实现的那个）在不同的机器上就是表现不一致，总会蹦出一些脚本出错的对话框。多年之后，我再回忆，可能也不完全是 IE 的毛病，跟我们写的不规范和用的不规范有关。</p>

<p>浏览器出错倒也不是开发期没测试出来，QC 人员很耐心的安装了各种版本的 windows 系统测试机，只是我们自己测试出错的概率要小很多。可是，一旦玩家量巨大，小概率事件就频频发生了。这种问题又实在不好重现，基本上是不了了之。</p>

<p>记得我还接过一个客服转过来的电话，说是一个玩家不好对付，让我帮着解释。那个略带上海口音的男性玩家，死命缠着我让我解释为什么游戏不能在他的机器上正常运行，反复申明他花了钱购买的正版游戏，要求我负责任。我想我很无奈。</p>

<p>丁磊也需要一个解释。对于不写程序的他，太多的 bug 导致了程序不稳定这个理由很难说服他。后来我想了个简洁的说法统一口径：IE 兼容性问题，导致了我们 client 的在不同的机器上容易出错。其实我们做程序的都明白这是个推卸责任的说法。只是太多的开发人员已经背负了很大的压力，我想选择 IE 做 UI 的这套方案是我提出来的，把责任推到 IE 上，我能帮大家多承担一些骂名。</p>

<p>结果令人哭笑不得的是，老丁倒是很轻易的接受了这个说法，就没怎么责怪开发团队，也没有怪我这个“罪魁祸首”。只是接下来的这么多年，时不时的拿这个段子奚落我一下：“看吧，别看我不懂程序，当时你提出来用 IE 的时候我就觉得不好，不过还是随你们去做了。让你犯过错才知道改”。(._.!)</p>

<hr />

<p>11 月里，几乎没我多少事。因为大家的工作都是修改 bug ，而我的那块基本没有什么问题，很稳定。经过一年的开发，我想我至少在 C++ 和设计模式方面领悟了不少东西。开始回头审视整个项目。其实游戏的 client ，并非一个庞大的工程。只要合理的设计，应该能做的很稳定。</p>

<p>开始一个人闷头写程序。</p>

<p>要来了通讯协议文档后，大约花了一个月时间，我做了一个简化版的 client  。虽然只是个雏形，但很多基本功能都有了。代码很小巧，我给他起了个名字，“小话西游”。设计上最主要的地方是，把游戏 client 逻辑做了严格的分层。把对象的管理、画面精灵动画的控制等等都隔离开，并将网络包以及画面无关的逻辑部分提取出来（这点为以后引入嵌入式脚本铺平了道路）。</p>

<p>丁磊看到了我做的这个小玩具后，第一个反应是，“能不能压缩客互端，做一个图形聊天室？”。我想他是对《大话西游》的现状失去信心了。当时人心也比较散，开始有人离开。有些开发人员甚至私下里谈论过大家散伙。</p>

<p>但是我不甘心。这是我毕业后全心投入的第一个项目，我不想看着它失败。不想我那些朋友们，那些 bbs 上相互调侃的网友们，觉得云风只会口上说说，真做起项目来不过如此。我想的是，其实做这么一个“简单的”软件，只要好好规划一下，不至于程序上弄的如此的不稳定。比如 UI 的问题，当时只是项目进度和人手上的不足使用的一个权益之计。而现在，我已经全部构思好该怎么实现了。</p>

<p>按丁的想法，把《大话西游》保留所有的图象资源，而将程序改成一个图形聊天室，体积缩小到 100M 以下是绝对不现实的。要知道，如果我们不做那些我绞尽脑汁的方法去压缩，客户端根本塞不进一张 600M 的光盘中。程序可以再写的短小精悍一些，但图象资源却小不了了。</p>

<p>我想的是，重新推翻再来一次。</p>

<p>做大话西游的 2.0 版是 dingdang 拍板下的决定。倒不用我去主张，程序员的心是共通的。dingdang 怎么说服丁磊的我不清楚，但我想不算太困难。网易只有两条路可以走：解散游戏开发团队或是重新再来一次。</p>

<p>是的，一开始，我们想做的只是 2.0 版，以次作为对老版本的升级，而不是后来的《大话西游II》。我那么的想重新来过，不是因为喜欢这个游戏，而仅仅出于一个自私的理由：要证明自己可以把这件事情做好。</p>

<hr />

<p>那时的网易可以说相当的不顺利。九月里，公司被 nasdaq 停牌。最后一天甚至跌到了五十多美分。在美国，公司面临着诉讼，因为最近的一期财报被认为掺假。历史上，惹上这种官司最终停牌的公司都没有好下场。</p>

<p>自主研发的游戏上市后，问题多多，反应平平。最高同时在线人数只有 5000 多，还是头几天创下的。</p>

<p>而国内几款韩国游戏却做的风风火火，在这个背景下，丁磊带着大猫猫去韩国寻找可以代理的游戏。丁磊在韩国的那几天，我明显感到他承受的压力。有一晚，我在写程序，他在 icq 上蹦出来，没头没脑的说了句，“失眠了，睡不着”。</p>

<p>我还记得大猫猫归来那天，从韩国抱回了大包小包的流氓兔，我抢到了两个。对了，公仔上有个小标签，赫然印着“Made in China” :) 。</p>

<p>不过正题是之后我们一起看的三个韩国新出的游戏。都是 3d 的，丁磊赞不绝口。一个叫做“Ragnarok Online”，一个叫做“MU”，还有一个是“Priston Tale”。让我也发表一下意见。我说，单看画面的技术含量和操作感，我最喜欢 MU ，其次 RO 不错。丁没说什么，不久，我们代理了 Priston Tale ，给他起了个中文的名字 ——“精灵”。</p>

<hr />

<p>补充，我努力回忆了一下，记不请最后这段发生的具体时间了。精灵后来是 02 年夏天上线的，谈合作应该更早一些。丁从韩国回来那天，天气不算太凉，他还带了件 T shirt 送人。我不记得那是 01 年的秋天还是 02 年的春天的事情。对比精灵的运营时间来看，是 02 年春天也有可能。但这里行文方便，我假设的时间背景是 01 年秋。有机会再求证好了。下面会接着写大话二的开发，而暂时不再谈精灵，先作一个说明 :) 。</p>

<hr />

<p>谢绝转载</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>The Implementation of Lua 5.0 中译</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/the_implementation_of_lua_50.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=365" title="The Implementation of Lua 5.0 中译" />
    <id>tag:blog.codingnow.com,2008://1.365</id>
    
    <published>2008-05-09T11:16:27Z</published>
    <updated>2008-05-09T11:25:34Z</updated>
    
    <summary>读者向海飞给我 email 了一份他翻译的《The Implementation of Lua 5.0》这篇 paper。原文可以在 lua.org 上下载 这篇由 lua 作者们写的 paper 对理解 lua 非常有帮助。有兴趣的朋友在 这里下载译文 译文最后附有译者的 email 大家可以直接向他反馈。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="lua与虚拟机" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>读者向海飞给我 email 了一份他翻译的《The Implementation of Lua 5.0》这篇 paper。原文可以在 <a href="http://www.lua.org/docs.html">lua.org 上下载</a></p>

<p>这篇由 lua 作者们写的 paper 对理解 lua 非常有帮助。有兴趣的朋友在 <a href="http://www.codingnow.com/2000/download/The Implementation of Lua5.0.pdf">这里下载译文</a></p>

<p>译文最后附有译者的 email 大家可以直接向他反馈。</p>
]]>
        

    </content>
</entry>
<entry>
    <title>写了个简易的 web server</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/tiny_web_server.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=364" title="写了个简易的 web server" />
    <id>tag:blog.codingnow.com,2008://1.364</id>
    
    <published>2008-05-08T17:41:11Z</published>
    <updated>2008-05-08T17:54:12Z</updated>
    
    <summary>根据昨天留下来的思路 ，我今天做了个 web server 。只用于给本地程序做配置界面用。 这个想法其实是以前用 google desktop 时明白的，gds 和 google 很多桌面软件都用浏览器做配置界面。其实就是自己做了个简易的 web server 而已。我也不需要太多，支持 GET 即可。仅监听本地端口，本质上没碰网络。windows 都不会弹安全警告。整个代码用 C 写的，才 200 来行。 做成了 lua 的一个模块，require 进来即可用，很方便 :) 再用上点 ajax 技术，操作感也不错呢。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="技术" />
            <category term="杂记" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>根据<a href="http://blog.codingnow.com/2008/05/eoeouaeaeaa.html">昨天留下来的思路</a> ，我今天做了个 web server 。只用于给本地程序做配置界面用。</p>

<p>这个想法其实是以前用 google desktop 时明白的，gds 和 google 很多桌面软件都用浏览器做配置界面。其实就是自己做了个简易的 web server 而已。我也不需要太多，支持 GET 即可。仅监听本地端口，本质上没碰网络。windows 都不会弹安全警告。整个代码用 C 写的，才 200  来行。</p>

<p>做成了 lua 的一个模块，require 进来即可用，很方便 :) 再用上点 ajax 技术，操作感也不错呢。</p>
]]>
        <![CDATA[<p>一开始想干脆在本机架一个 <a href="http://www.keplerproject.org/">kepler</a> ，连文件服务都不需要提供，专心实现 ajax 需要的必要接口。后来失望的发现，xmlhttp request 这个玩意，居然不支持跨域请求。哦，我不该用居然这个词，人家浏览器也是为了安全性考虑的。</p>

<p>又加了十几行代码让我的 web server 支持获取文件的请求，其实也满简单的。</p>

<hr />

<p>白天里同事非要用 web service 做一个，他已经实现出来了，感觉也满好。不过我有点反感 SOAP 这个东西，不想把我们游戏引擎搞的太臃肿了。明天再接着商量商量看吧。</p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（九）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_9.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=363" title="那些日子（九）" />
    <id>tag:blog.codingnow.com,2008://1.363</id>
    
    <published>2008-05-08T14:22:12Z</published>
    <updated>2008-05-08T17:20:21Z</updated>
    
    <summary>在网络游戏还没有盖过单机游戏的风头之前，大家都认为网络游戏只是电脑游戏的一个小分支。制作、销售的流程也还停留在旧的思维上。 我们都觉得，费劲心力做了这么一套东西出来后，应该先收玩家一些费用。简单说，也就是卖客户端了。7 月里，《金庸群侠传 online》上市，卖出了 10 元的低价。这个游戏吸引了不少玩家，玩家后期的开销远远不只 10 RMB 这么一点。运营商其实也不在乎 client 的这点收入，网络游戏也不惧怕客户端盗版，巴不得多点人进来玩呢。 不过，一开始没人去做免费的客户端。我想有几个原因。其一是固定思维所限，其二是当时网络带宽不够，拨号上网依旧是主流。还是得依靠光盘发行。既然需要走传统的销售渠道，那么也总得设个价格。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>在网络游戏还没有盖过单机游戏的风头之前，大家都认为网络游戏只是电脑游戏的一个小分支。制作、销售的流程也还停留在旧的思维上。</p>

<p>我们都觉得，费劲心力做了这么一套东西出来后，应该先收玩家一些费用。简单说，也就是卖客户端了。7 月里，《金庸群侠传 online》上市，卖出了 10 元的低价。这个游戏吸引了不少玩家，玩家后期的开销远远不只 10 RMB 这么一点。运营商其实也不在乎 client 的这点收入，网络游戏也不惧怕客户端盗版，巴不得多点人进来玩呢。</p>

<p>不过，一开始没人去做免费的客户端。我想有几个原因。其一是固定思维所限，其二是当时网络带宽不够，拨号上网依旧是主流。还是得依靠光盘发行。既然需要走传统的销售渠道，那么也总得设个价格。</p>
]]>
        <![CDATA[<p>网易没有自己的销售渠道，所以选择了一家代理商，智冠。现在看起来很好笑，如今都是花钱想方设法的把新出的游戏 client 送出去，发到最终玩家的手上。那一次，智冠居然还要付我们一些版权费用。不过，我们必须给每份 client 附加一个 cd-key ，没有 cd-key 就不准激活游戏。这是从暴雪的 battle net 模式学来的，可却是一个失败的抄袭。等到游戏上市那天，许多玩家下载到了 client 却不能进入游戏，论坛上怨声载道。</p>

<p>也因为要为光盘制作的周期预留一段时间的缘故，我们的项目 dead line 比预定的运营期要早一点。一开始定的 9 月中旬显然是干不上了。micro 向上面申请延期，结果只增加了一个月时间。我觉得，即使多这么一个月，也是不可能完成的了。</p>

<hr />

<p>九月里，游戏大概有个雏形出来。虽然 bug 百出，但勉强算是做全了名义上的那些功能。我试玩了一下，非常的不满意。我想，这样的产品是不能拿出去的。大家做的实在是太仓促了，感觉只是为了完成那些功能而去完成，不能算是一个游戏。太多细节没有去推敲。</p>

<p>当然，我没有细玩，不知道到底有些什么玩点。单从 client 的操作感来说，已经是很差了。一个很明显的问题就是，一旦玩家在场景中跑动，屏幕抖的要命。不停下来，根本看不清屏幕上那些玩家的名字。我仔细研究了这个问题，判断是屏幕卷动速度不均匀导致的，便着手改进。</p>

<p>简单的说，就是不要把主角固定在屏幕中间。无论他以怎样的速度移动，都只用一像素每帧的速率顺势卷动镜头，同时严格限制帧速率。当玩家向一个方向连续移动速度过快时，就加大镜头移动速度拉回来。这里的要点：不要让镜头速度切换的频率过高。</p>

<p>真正调的舒适还是颇费了一番工夫的。我在家折腾了两晚，写了个小 demo 拿给大家看。其实我心里还有另一番用意。当程序人员围坐在我的座位周围时，我迟疑了一下还是说了出来，“不如我们把客户端重新写一遍吧”。</p>

<p>这个想法显然是吓到大家了。所剩的时间已经不多，以大家当时的能力，就算不吃不睡估计也干不完。古越的反对声音最有代表性，他说，如果只是要把镜头控制这部分改过来，参照我写好的 demo 代码，花几天就可以搞定。如果别的地方有问题，也可以如此照办。看不到什么特别的需要全部推倒重写。我也实在找不出什么理由坚持我的观点。这件事就这么过去了。</p>

<p>大家继续加班，几个程序的工作压力都很大。而我负责的引擎部分已经没什么事情可以做了。就自己一个人窝在那想，如果重新设计，这个 client  应该是怎样做更好。也随手搭点代码试试。</p>

<hr />

<p>在 client 压盘前，我们做了一个内部测试。这次测试直接招募了一批玩家长驻公司。很多外地来的玩家，干脆就在公司的空位上打起了地铺。这批可爱的玩家每天给我们提意见，并对游戏的 bug 做出了极大的包容。他们中的很多人，日后都成了网易的员工。QC 部门也是那个时候成立的。</p>

<p>说是 QC 部门，但不完全是做质量控制方面的活。因为当时的项目，解决 bug 的速度远远低于发现 bug 的速度。想来 QC 部门不需要做太多事情，就足够开发部门的人忙了。所以我们也找出一些活儿分给他们的人做。</p>

<p>比如果子就写了个简单的编辑器，让 QC 的头儿何燕去校对并修正在 photo shop 里标记出来的人物行走区域。这个编辑器做的太匆忙，以至于后来只有何燕一个人会摆弄。我也做了另一个编辑器，向场景上放置一些动画装饰，以及为每个场景设定背景音乐。随便拎了个有兴趣弄这个的人（似乎那小子网名叫游子，呵呵，其实我还是有记性的）过来就让人家做。</p>

<p>其实后期这些事情多半是我没事找事搞出来的，不在原来计划内。凑着画面，感觉画面不够生动，就想点办法弥补。做美术的头儿周云倒是挺配合我的工作，帮着做了许多动画。天宫中的云彩、花果山的瀑布、长安城那护城河中的流水……</p>

<p>到了压盘前的那几天，古越忙着改 bug  ，果子在做一个 mp3 播放器。果子的最后这个任务来的很突然，原本 client 的声音播放程序是我老早就写好了的，关于音频压缩格式解压，直接调用的 windows 自带的 codec 。没想到后期测试的时候发现， windows 95 的系统并没有默认安装 mp3 的 codec 。临时改动 engine 来不及了。果子说可以找到一个开源的东西弄弄。但那时 client 代码比较乱，不好向里面插新代码。我出了个馊点子，不如单独写一个 mp3 播放器。当 client 切换场景时，向这个播放器发送消息切换背景音乐。反正别再大动 client 的代码就好了。（这个临时拼凑起来的播放器也有很多问题，在游戏发行后，我们就把它换掉了，是安宁写的 mp3 解码器，一直用了好多年）</p>

<p>我也没闲着，开始审核 client 的各种数据资源。</p>

<p>要说整个《大话西游》的 client ，除了主程序部分，我想没人比我更熟悉那些资源数据的数据格式，以及各个 dll 的用途了。基本上，我设计了所有的磁盘上的文件数据结构。又因为是第一次实作，这些东西在开发期改动了很多次。各种生成转换工具几乎都是赶时间随手写的，异常混乱。几乎每样东西，离开了制作它们的相关人员，只有我可以检查出是否有毛病了。检查方法也是各种方法一起上：写程序检验、用 16 进制编辑器打开肉眼查看，等等。</p>

<p>这些校验的活，因为项目后期的混乱，没有人去做，甚至没有人想到去做。大家只想把表面上看起来要做的时间做完，回家能多睡会觉就好了，光就那些看起来必须完成的工作，已经累的人够戗。我想，若不是养了我这个闲人，《大话西游》的第一版上市估计会更糟（实际上已经糟透了，更糟也是无所谓的吧）。也因为这些琐碎工作，我从最闲的人变成了最忙的一个。</p>

<p>最后一周，做不完的事情啊。我坐在自己的位置上，不停的干活。用最快的速度写着一些自动化，半自动化的工具。觉得可以了，无论白天黑夜，在办公室里随便找出一个貌似闲着的活人，把东西交给他，说，现在需要你帮点忙，应如何如何去做，有问题回头来找我。</p>

<p>那几天，公司的洗手间坏了，正在翻修。需要方便的时候要下楼走出去老远。不想浪费时间，干脆就不怎么喝水。每一个通宵只用上一次厕所。就这样，不知道时间过去多久。只觉得，身边的人来了，拍打着键盘，身边的人走了，安静下来；天黑了，显示器特别的亮，天亮了，从窗外射进阳光。</p>

<p>每当项目最紧张的时候，我都觉得自己的精力一下子变的特别旺盛，虽然疲惫，但是不会发困，脑子也转的很快。记得那最后的一天深夜，突然发现有一张地图的阻挡层信息做的不对，需要修改。可第二天上午就要把 client 打包送去压盘，等不到负责人第二天过来上班。</p>

<p>这个活一直是候燕在做。而那时，她已经回家，在番隅的家，离公司很远，显然是赶不过来的。果子因为困的不行，回家睡觉去了。我们都不会用他写的那个编辑器。打了几通电话，还是没问明白。我想了几秒，估算了一下距离天亮的时间，和手头上需要做的活儿。立刻下决定重新写一个工具。交互式编辑器当然没那么快能完工，但是我熟悉文件的数据格式，所以写了个一次性程序将内部出错的数据导出成文本。再写了个导入工具，可以将修正后的文本编码导回。做好工具后，便可以交给其他人去修改了。需要交代的只是那些中间文本的含义。这次的经历，让我看到了文本数据的秒处。以后我自己的项目里，所有资源一律要求在开发期制作成可读的文本结构，当考虑到效率时，再写转换工具生成二进制格式。</p>

<p>接下来制作了几段视频的播放程序：制作人员名单、合作方智冠的动画 logo ，还有大话西游的片头动画。是的，最早的大话西游是有一小段片头动画的，因为我们觉得，只要是电脑游戏，都必须要有片头动画。当时周云做好了交给我的时候，我还觉得它过于简陋了点。</p>

<p>我没时间写视频的播放器，干脆把他们压缩成一张张静态的 jpg 顺着显示，倒也简单。当我看到离天亮还有几个小时时，居然多花了些心思制作制作人员名单的播放模块，被称为 Credit 的那个恭喜。我想还有时间，应该让它绚一些。甚至还放了个彩蛋进去。</p>

<p>天终于亮了，熬了三天还是四天，我已经分不清了。给早上来报道的同事交代了哪些数据应该打包，头也不回的上了出租车。几乎在对司机交代目的地的那句话说出口时，睡着了。</p>

<p>今天，我找出了当年那天做的那段程序，是几个月后把代码和数据提取出来重新制作的一个独立包，没有代码，只有执行文件。里面用的背景音乐是网易购买了使用权的大话西游电影主题曲《一生所爱》，我很喜欢。里面还有早期同事的集体照，参与制作的所有人的名单，只要为这个游戏工作过哪怕几天的人都列了进去。那是很多回忆。只可惜刚刚试了一下，程序在 xp 上似乎不能运行 :( 就不给大家推荐了。</p>

<hr />

<p>临近发行时，2001 年 9 月 27 日，周星驰过来公司，他是游戏的代言人。这个日子这么明确，是因为那天我约了牙医补牙。结果没赶上大家合影，有点遗憾。昨天翻出病历，找到了这个时间 :) 。第二天，星爷又到 36 楼，我也在。我凑上去聊了许多。别的不记得了，就记得光在说《南方公园》（当时很流行？） 。星爷的普通话讲的很好，人也和善，没什么明星架子。他的粉丝太多，大家又不好意思凑过去要签名，看我混的挺熟，一个劲的让我递签名本，星爷都一一的签了。</p>

<p>我抽屉里刚好有样东西感觉挺有纪念意义：《大话西游》客户端的母盘 :) ，让他签上了名字。有点可惜的是，公司的数码相机碰巧没电，始终没能没留个影。</p>

<hr />

<p>哦，对了。说起这张母盘，还有点故事。今天时间还早，随便写写。</p>

<p>当时我想，什么游戏发行后都免不了盗版，何况以后激活帐号另需要 cd-key 。让别人盗还不如让兄弟盗。我在广州有个好兄弟，tarcy （很奇怪他怎么用个女性英文名做网名），做盗版行当的。这个家伙研究软件加解密出身，水平挺高，但在软件破解的圈子外估计没什么人知道。不过他有个小弟名气很大。dingboy ，不知道有人有印象否？呵呵，不知 google 之，我就不介绍了。</p>

<p>我把盘交给 tarcy 让他压几千片卖。那个年代走这个渠道比正规的卖场要有效率的多，几天就在全国铺开了。</p>

<p>接下来的一年多，单机游戏迅速没落，加上互联网带宽的快速发展。tarcy 他们没过多久就洗手不做盗版盘。我想有一技之长的聪明人不会被埋没，他们改行写网游外挂，又赚了不少钱，差点投资自己做游戏。此乃后话，放到以后再写吧。</p>

<hr />

<p>谢绝转载</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（八）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_8.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=362" title="那些日子（八）" />
    <id>tag:blog.codingnow.com,2008://1.362</id>
    
    <published>2008-05-07T15:05:53Z</published>
    <updated>2008-05-07T16:58:31Z</updated>
    
    <summary>今天工作上的事情弄的比较晚，没留出足够时间来继续写这个。本来打算直接回家睡觉的，想了想还是继续写点。凡事可以坚持做下去，往往靠的不是兴趣，不是责任，而是习惯。我不想让这些对过往的记录成为今天的负担，但也担心一旦放下就会拖上好久。反正腹稿都已经打好了，无论内容多少，还是保持着一天一更新的习惯吧。让我顺利把这件事情做完。 Dingdang 具体哪天加入的游戏开发组我已经记不清了。因为他做的是服务器那块，我不太关心。大约是在《大话西游》项目中后期吧，他说，服务器这边进度太慢，就过来了。他以前玩过 mud 挺有兴趣。但是其工作主要还是在底层。 大话的服务器最早是搭建在 mudOS 上的，一个开源的东东，用在各种文字 mud 上。做文字 mud 通常还会用一个中间层，叫做 mudlib 。早年传说中的方舟子一帮人等做《侠客行》，就是指做了一套 mudlib ，被后人用在各种中文文字 mud 上。听说大话的开发人员也自己做了套 mudlib （听说而已，micro 似乎跟我提过他们没用侠客行的代码，太久远的事情不想证实了），不过我对使用 mudOS 却不以为然。什么年代的东西啊，都 21 世纪了，还在用。也就那么点代码，就不能放弃掉自己写一个吗？而且原本为几十个人同时游戏设计的框架，用在这么多人同时在线的网游上合适么？...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>今天工作上的事情弄的比较晚，没留出足够时间来继续写这个。本来打算直接回家睡觉的，想了想还是继续写点。凡事可以坚持做下去，往往靠的不是兴趣，不是责任，而是习惯。我不想让这些对过往的记录成为今天的负担，但也担心一旦放下就会拖上好久。反正腹稿都已经打好了，无论内容多少，还是保持着一天一更新的习惯吧。让我顺利把这件事情做完。</p>

<hr />

<p>Dingdang 具体哪天加入的游戏开发组我已经记不清了。因为他做的是服务器那块，我不太关心。大约是在《大话西游》项目中后期吧，他说，服务器这边进度太慢，就过来了。他以前玩过 mud 挺有兴趣。但是其工作主要还是在底层。</p>

<p>大话的服务器最早是搭建在 mudOS 上的，一个开源的东东，用在各种文字 mud 上。做文字 mud 通常还会用一个中间层，叫做 mudlib 。早年传说中的方舟子一帮人等做《侠客行》，就是指做了一套 mudlib ，被后人用在各种中文文字 mud 上。听说大话的开发人员也自己做了套 mudlib （听说而已，micro 似乎跟我提过他们没用侠客行的代码，太久远的事情不想证实了），不过我对使用 mudOS 却不以为然。什么年代的东西啊，都 21 世纪了，还在用。也就那么点代码，就不能放弃掉自己写一个吗？而且原本为几十个人同时游戏设计的框架，用在这么多人同时在线的网游上合适么？</p>
]]>
        <![CDATA[<p>网易的同事们完全扔掉 mudOS 这根拐杖是到 大话3 的事情了。主要还是因为太多逻辑代码用 LPC （mudOS 内置的一种类 C 的脚本语言）实现。大家一点点的改造，先是将文本通讯协议改成对数据流量更节约一些的二进制方式，为特殊的需求添加一些代码（例如定时数据持久化），再做一些底层的优化，把 select 的网络模型改为 epoll ，等等。直到全部更替。这些工作持续了 4,5 年。</p>

<p>一开始，当然做不了这么许多。大家还是主要在完成游戏的进度。dingdang 坐我的旁边，中间靠走道的拐角处。桌子上没什么东西，上班时就带一个笔记本，在那里敲敲打打。</p>

<p>我对那段时间在工业园的记忆不多。因为每天，周围的人都是一个情景，闷头做事。晚上，走的晚的人倒不是很多，我和 dingdang 加班的次数比平均水平高一点。</p>

<p>他那个时候好象在热恋中，晚上经常窝在椅子上，捏着手机很小声音的讲电话，每次都很久很久。工业园的办公室晚上都是不开顶灯的，大家都很享受在黑暗里办公，显示器亮亮的，四处安静的很。</p>

<p>也偶有喧闹的时候，那是古越的 client 和 ten 以及 dingdang 联合调试。我没关心技术细节，只是从他们的对话中感觉有无数的 bug 改不完。有点忧虑，但无能为力。从一开始就没有参加到这块的逻辑中去，我只能好好做我那块东西。</p>

<p>记得当时 client 和 server 都有严重的内存泄露问题。client 这边我想了很多方法帮古越定位。server 那 dingdang 也在想办法。我们讨论过这个问题，渐渐的就谈到了内存管理器。dingdang 说他实现了一个 伙伴（Buddy）算法的内存分配器，主要是想减少一些内存碎片。自己写的内存管理器也可以有效的侦测到内存泄露的发源地。另外希望以合理的内存布局，让一些 bug 引起的内存越界访问时，减少服务器崩溃的几率。我在这方面是完美主义者，觉得根本就不应该允许 bug 的存在，但是 dingdang 显得很无奈。绕开这个有争议的话题，我们还谈了许多。只是现在都不记得了。</p>

<hr />

<p>client 这边的分工倒是慢慢的很明确了。古越在配合服务器组实现 client 对应的逻辑。我来做底层，几乎不用搭理游戏是什么。比如大话西游那么丰富的场景和人物角色，开发期间只看过两三个，都是用来调试engine 用的。果子做了一部分跟图形无关的 client 底层，主要是网络包的分发处理。现在的眼光来看，设计的并不好，采用了多线程结构徒增了一些复杂度。如果追究原因的话，我想是因为当时我们 client 没有一个好的软件架构人员统筹安排，基本上都是各个人想怎么做就怎么做造成的。</p>

<p>UI 部分的呈现是郭斌负责，而跟 IE 接口的地方则是果子和另一个程序黄东海在做。说起后面这个人，也是游戏圈混迹多年的老人了。本来是做 3d engine 的，不知怎么就来到的网易。来之前我听过一些圈内的朋友说他脾气不是很好，比如老是敲着桌子抱怨美术没按他的思路去做。不过来到网易后可能没有啥担纲挑粱的工作，也见不出他的脾气。他只工作了一个月就离开了，那个月神龙见首不见尾，突然就出现在工位上，而后有几天见不着人。悄然辞职（或者就没正式入职）后又回家去做 3d ，几年后还有一面之缘，暂且不表了。</p>

<p>还有一块，是李鑫做的。那就是 client 外挂的聊天室。在时间紧张的日子，我拼命的找方法可以减少一些程序量。既然我们已经嵌了 IE ，那么就干脆做到底。这种实现方式在后面的产品里取消，但外挂聊天室的形式却保留了下来，成为网易游戏的一大特色。</p>

<p>网易当时的 web 聊天室做的不错，丁磊特别得意。记得他曾对他的朋友们吹嘘，我们的聊天室做的是中国技术最好的，一台机器可以支持 4000 人同时在线。这块东西是李鑫的作品，参照 IRC 协议实现的。client 部分用的 HTML ，server 用 C++ 完成。</p>

<p>李鑫在我刚进网易时就有人介绍给我认识。介绍人是 freemind ，我读大学时就认识的好朋友。多年的网友。我想 freemind 这个网名还会有许多人有印象吧 :) （前几天有读者来信说，让我怎么也要提一下 freemind ，说早年游戏圈里这么有名的人怎么能忽略掉。哈哈，我不会忘记这位老朋友的，有机会以后再写一次）他和李鑫曾是《电脑报》的同事，一起做过《电脑报》的多媒体光盘。在没有互联网的年代，那可是样好东西。</p>

<p>不知是什么缘分，我居然记得读过李鑫的聊天室源程序（那段时间，项目组其他人的代码都是没什么精力去看的）。印象比较深刻的是，他在许多地方的类接口传递的 CString 而不是 const CString &amp; 。我们就此还讨论过一些 C++ 代码的性能问题。他表示是老代码一直拷贝用下来，没太在意。</p>

<p>项目就这样由许多人分头做着，一天天临近死亡线。</p>

<hr />

<p>话说那段日子，还有另外一些事情。给我的记忆比开发大话要深刻许多。</p>

<p>北京的那帮哥们倒是做的有声有色起来。我离开北京后，他们也更改了一些计划。做手机游戏引擎的事情搁浅了，改为先做一些有特色的软件，几个游戏和一个 mp3 播放器。后者是安宁在优化，汇编是他的专长，有时电话里聊聊，他对他在好几款低端硬件上实现了 mp3 的流畅播放甚是满意。</p>

<p>Nokia 在广州开一个什么会议，庞鑫和安宁来到广州。我们少不了要聚一下。庞鑫给我看了他在 Nokia 9100 上做一个伪 3d 的模拟空战游戏，非常刺激。让我想起了天惑。据说游戏让 nokia 的家伙们看傻了眼，原来这机器机能这么强啊。嘿嘿，安宁跟我说，他们 hack 了 9100 的系统，用官方的 sdk 自然是做不出这效果来的。</p>

<p>丁磊说想请大家吃饭，让我先订了个房间，带大家先去坐着。主人没到，大家都不敢点菜。好在我们有的是话题聊。</p>

<p>这时候手机响了，我一看，是丁老大的。庞鑫在一旁嘟噜着，早着呢，那家伙刚出门。接起来，老丁在里面大声的说，“我已经出门了，马上就到”。又等了大约半小时，手机铃声再次响起。还没等我接呢，庞鑫再次插了一句，“他在停车呢，当大老板的就这样。”“你们再等等，我停好车就上来”，听到这句，大家都笑了。</p>

<p>这是 2001 年 7 月中旬的事情。不是我特地记下了这个日子，是因为第 2  天，我们在我家旁边的小山酒吧庆祝北京申奥成功。安宁喝了许多，我也是。大家特别的高兴，街上满是欢腾。2008 ，好遥远啊，等奥运真的在北京召开的那一天，大家会是怎样的境遇呢？</p>

<p>过了几个月，庞鑫和安宁来到了广州，还有徐创（逆火的另一创始人）。丁说，我们可以开始做 3d 游戏了。这是 天下 2 的开始。虽然那个项目的头几年，完全没有想到会重新以《天下》来命名，但我想庞鑫等的到来是网易开始在 3d 领域尝试的第一步。比官方记载的《天下贰》的开发历史早上许多。</p>

<hr />

<p>谢绝转载</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>数值调整、模拟器、编辑器</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/eoeouaeaeaa.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=361" title="数值调整、模拟器、编辑器" />
    <id>tag:blog.codingnow.com,2008://1.361</id>
    
    <published>2008-05-07T13:22:39Z</published>
    <updated>2008-05-07T14:37:10Z</updated>
    
    <summary>最近做游戏数值有点头大。也研究了一些游戏的设定，有点心得。举个很小的例子来谈谈： wow 里的护甲对物理伤害吸收是乘一个百分比的，其公式为： min (护甲/(护甲 + 400 + 85 * 敌人等级) , 0.75) 怎样理解这样一个公式的内在含义？为什么会设置成这样？...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="技术" />
            <category term="游戏开发" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>最近做游戏数值有点头大。也研究了一些游戏的设定，有点心得。举个很小的例子来谈谈：</p>

<p>wow 里的护甲对物理伤害吸收是乘一个百分比的，其公式为： </p>

<p>min (护甲/(护甲 + 400 + 85 * 敌人等级) , 0.75)</p>

<p>怎样理解这样一个公式的内在含义？为什么会设置成这样？</p>
]]>
        <![CDATA[<p>和敌人等级相关很好理解，对手越强，吸收的越少。这样可以方便伤害公式的设计。</p>

<p>因为，一个人的物理抗击打能力和两个基础值有关，HP 的长度，和护甲伤害吸收率。（暂且不考虑回避率和特别技能伤害等的影响）</p>

<p>随着玩家等级的提高，基于成长性考虑，系统一定会让玩家的 HP 更长，护甲更厚。但是对应的伤害输出则只有一项数值。这样，要么以更快速度提升玩家的伤害输出能力，要么就要削弱面对高等级对手时的伤害减免能力了。</p>

<p>由于 wow 里各种人物之间有护甲差别（板甲、锁甲、皮甲等），为了平衡起见，不至于拉大高等级玩家见护甲差别优势，又保留护甲升级空间，暴雪选择了根据对手等级来削弱护甲能力的方式去做，这是最自然的选择。</p>

<p>至于 75% 吸收封顶，应该是受 D&amp;D 规则影响。保留实力相差过大时，不至于让弱势方毫无还手之力的可能。（D&amp;D 规则中，投出骰子 1 就一定 miss ，wow 同样也设定了这样的保底 miss 率）</p>

<p>重点来看看这个伤害吸收公式的框架，为何要采用一个倒数曲线来描述其变化呢？</p>

<p>我们来看常见的另一种涉及百分比变化的数值设定方法，那就是逐步累加百分率。很多游戏都有使用。（比如还是 wow 中，对致命一击率的设计）但是，对于宽泛的百分比变化，这样的设计是不太好做平衡的，因为价值很难直观凭估。</p>

<p>我们来看这个伤害吸收率，假定有一件装备可以增加 1% 的伤害吸收率。那么你如何评价其价值？跟许多玩家的数字直觉不同，在你的基础吸收率不同时，其价值可能截然不同。</p>

<p>举个极端的例子，假设对手的伤害是 100 点，而你原来毫无伤害吸收能力（护甲为 0%）。那么增加 1% 的伤害吸收率后，你就可以只承担 99 点的伤害。这种改善是微乎其微的。但是，如果你一开始有 98% 的伤害吸收率呢？那么再没有加这件护甲前，伤害是  2 点，一旦穿上后，吸收率增加到 99% ，就只会受到 1 点伤害了。护甲性能因此提高了足足 1 倍。</p>

<p>这就是 wow 把护甲值和伤害吸收率设计成倒数关系的缘故。</p>

<p>当玩家的 HP 固定长度，对手的伤害输出能力一定时，HP 的抗击打次数和对手单次伤害成正比。当对手的单次伤害被削弱一个百分比 d ，那么防御方的抗击打次数（或理解为存活时间）就提高了相同的百分比 d 。</p>

<p>经过公式换算过的护甲点数，1 次线性的描述了玩家抗击打能力的提升。这样，同样一件加 200 点护甲的装备，给任何人，任何职业，任何等级的人装备上，提升的防护能力就可以（在抵抗同一对手的攻击的时间长度这个意义上）保证一致。在此基础上，衡量护甲加成的点数的内在价值，就变得容易估算了。</p>

<p>OK 。如果要做护甲点数增加一定百分比，甚至翻倍这样的技能或职业设定怎样？wow 里的熊德就是这样的。如果这种技能多了，一定破坏平衡，理由正是上面分析过的。wow 这个护甲吸收伤害公式和数值增量的值密切相关，收益和增量成一次线性关系。百分比则会破坏这个平衡。</p>

<p>如果想做呢？比如有职业有技能是增加护甲点数百分比，天赋可以再增强这个百分比，饰品也可以对护甲点数以百分比增强？</p>

<p>好办，用幂函数曲线去拟合护甲点于吸收率的关系就好了，这就不展开讨论了。</p>

<hr />

<p>这两天想写个战斗模拟器来调试战斗数值计算公式。本来想快速出个原型而不必等 client 细化后再做。想来想去，找不到特别快速的方法。考虑了一下做 web ajax 版的。<a href="http://blog.codingnow.com/2007/09/bridge_ajax_lua_kepler.html">前段时间玩过</a>，感觉用以前写的代码改改也满好，做好了可以方便我们几个策划去试验。不过做起来还是满心烦。</p>

<p>C# 的版本倒是有同事弄了一个，觉得还是不太方便。另外有人说这几天想用 logo 做一个，我等着看效果吧。</p>

<hr />

<p>这两天还有人在做 3d 粒子编辑器，也是想快速做出来。我提议说，界面的需求这么复杂，还是做个 web 接口的吧。3d engine 不必嵌入到过于复杂的软件应用中去。</p>

<p>其实我的意思是，写个超级简单的 httpd ，甚至不用支持完全。我们只需要听一个本地端口，只支持 GET 就好了。读入请求的第一行，看是 GET 开头的，就把 URL 那行文本读进来，当作控制指令分析就够了。足够满足基本的 ajax 应用。然后随便架个轻量成熟的 httpd 处理静态文件来描述控制界面。</p>

<p>我想顶多不超过 200 行 C 代码就可以搞定这个框架。</p>

<p>不过某人还是用 web service 做了一个 :) 看起来还是满 cool 。</p>

<p>今天折腾这些个东西到这么晚了，还在考虑要不要继续更新回忆录。但愿睡个好觉。</p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（七）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_7.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=360" title="那些日子（七）" />
    <id>tag:blog.codingnow.com,2008://1.360</id>
    
    <published>2008-05-06T12:56:10Z</published>
    <updated>2008-05-09T04:57:15Z</updated>
    
    <summary>01 年的夏天到来的时候，《大话西游》跨过了一个里程碑。古越发了一个内部的 demo ，没有网络功能，只是一个主角在两个场景间转悠。一个长安城，一个化生寺。回想起来，整个 demo 就是被逼出来的，没什么太大意义。老板说，要有一个 demo ，那么就有了。 我的场景管理模块完成了，角色精灵的显示完成了，其实要做的工作只是粘合一下，没什么实质的东西。这种 demo 更像是无数国内开发小组忽悠投资用的玩意，秀几个人物，来两个场景转悠一下。只要美术做的足够漂亮，就足够可以蒙过那些不玩游戏的投资人了。这样的 demo 多如牛毛，相互之间不同的是，图象上能表现出来的技术含量高低：2d 的还是 3d 的，有多少特效，画面刷新率多少等等。其实离游戏还远着呢。图象表现上的技术，是游戏开发中最简单的技术了。倒不是技术含量低，而是一旦有人克服了技术点后，都是成熟的玩意。接口简单易用，也容易独立的更新换代。从工程角度上讲，可以正交分解的模块都是简单的东西。 不过话说回来，在上个世纪，国内就连这些简单的部分也做不好。随便发行个（单机）游戏，不在底层出点 bug 就可归为上成佳作了。多少好的游戏就毁在引擎的不稳定上。离开一个稳定的引擎支持，就不要奢谈游戏性的调整。妄图在一个不稳定的引擎基础上设计出一个好的游戏出来，那是空中楼阁。绝对不存在一个游戏，单单只是程序有太多 bug，而游戏设计却非常棒的。程序这块做坏了，不仅仅影响玩家的感觉，同样影响策划的工作。等到《梦幻西游》出现在这个故事中，我会展开来谈谈这些。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>01 年的夏天到来的时候，《大话西游》跨过了一个里程碑。古越发了一个内部的 demo ，没有网络功能，只是一个主角在两个场景间转悠。一个长安城，一个化生寺。回想起来，整个 demo 就是被逼出来的，没什么太大意义。老板说，要有一个 demo ，那么就有了。</p>

<p>我的场景管理模块完成了，角色精灵的显示完成了，其实要做的工作只是粘合一下，没什么实质的东西。这种 demo 更像是无数国内开发小组忽悠投资用的玩意，秀几个人物，来两个场景转悠一下。只要美术做的足够漂亮，就足够可以蒙过那些不玩游戏的投资人了。这样的 demo 多如牛毛，相互之间不同的是，图象上能表现出来的技术含量高低：2d 的还是 3d 的，有多少特效，画面刷新率多少等等。其实离游戏还远着呢。图象表现上的技术，是游戏开发中最简单的技术了。倒不是技术含量低，而是一旦有人克服了技术点后，都是成熟的玩意。接口简单易用，也容易独立的更新换代。从工程角度上讲，可以正交分解的模块都是简单的东西。</p>

<p>不过话说回来，在上个世纪，国内就连这些简单的部分也做不好。随便发行个（单机）游戏，不在底层出点 bug 就可归为上成佳作了。多少好的游戏就毁在引擎的不稳定上。离开一个稳定的引擎支持，就不要奢谈游戏性的调整。妄图在一个不稳定的引擎基础上设计出一个好的游戏出来，那是空中楼阁。绝对不存在一个游戏，单单只是程序有太多 bug，而游戏设计却非常棒的。程序这块做坏了，不仅仅影响玩家的感觉，同样影响策划的工作。等到《梦幻西游》出现在这个故事中，我会展开来谈谈这些。</p>
]]>
        <![CDATA[<hr />

<p>对于这个 demo ，不光是在游戏部门内展示，为网易工作的大多数人都见过了。既然，这个 demo 根本不应算是这个游戏项目的里程碑，自然也没有收集到多少有价值的意见。许多人只是表示，如果护城河里的水可以动就好了，岸边的柳树应该随风摇摆一下…… 是啊，谁不想更生动一些呢？</p>

<p>就在那几天，游戏开发团队全部搬离了市中心，迁入处于城郊的天河工业园。今天，那一带热闹多了，甚至有了四星酒店，高档商品楼，满街的饭馆。科韵路那条小街也被改造成有中央隔离带的主干道，只是当年，我第一次到工业园区的时候，只觉得：荒凉。</p>

<p>一开始我不想搬到工业园去上班，因为不想住在那边。而每天从市中心奔过去的话，来回又会浪费太多时间。广州网易财务部的头儿 Rose 大姐在离职前嘱咐道，给云风在 36 楼留个位置吧，我就留了下来。有时就在 36 楼写代码，除了大猫猫，只我一个游戏开发的。好在网易技术部的人也混熟了几个，倒是不寂寞。有时也去工业园看看，micro 给我在那边留了个工位，添了台机器。</p>

<p>没人知道我今天在哪里，明天去何方。如果我不在工业园，那么就在 36 楼；不在 36 楼就在工业园。如果我在家里办公而不去任何一间办公室报道，恐怕没人会知道。只是我从没这么做过。</p>

<p>只到半年之后，工作越来越忙，接连两周，我每天都赶去工业园。到了第三周再回去 36 楼的办公室时，发现抽屉里已不是我的物件了。旁边的同事对我说，“以为你不来了呢，现在有人坐这儿了。你的柜子在储藏室里。”。我在储藏室没找到我的东西。那使我遗失了许多私人物品，一些信件，笔记，相片之类的。有点怅然若失。但不久就想开了。人活在这个世界，没有什么不可以失去的。即使记忆、纵然生命，百年后，尘归尘、土归土。</p>

<hr />

<p>建华路 25 号 2 楼，1500 平敞开的几大间屋子。网易游戏部新进驻的时候，只坐了一半（一个大开间）。装修很别致，据说是丁磊从硅谷学来的风格。铺着地毯，大家都穿拖鞋，甚至打赤脚。天花上没有吊顶。楼上是住家，粗大的下水管道只是用彩色的塑料胶布缠了一下。偶尔能听到抽水马桶的冲水声，大家笑称，都是肥水呢。</p>

<p>另外空着的三间大房间，很久很久以后摆上办公桌。一间里放了张乒乓球桌，晚饭后，大家排着队打球。据说古越的老爸是乒乓球教练，曾经发明了一种碟形球拍，有专利的。服务器的主程 ten 是乒乓好手，我水平一般，陪他们练练球而已。另一间里吊了一个沙袋，有人在里面拳打脚踢。累了，就去一间有电视的小休息室，在 ps 铁拳上继续。</p>

<p>给我们搞卫生和做饭的阿姨有两个，一个胖胖的，我们管她叫胖阿姨；另一个瘦瘦的胡阿姨。阿姨挺牛的，不讲卫生或是浪费粮食会被教育的。她们不算正式员工，但绝对是游戏部门的元老。</p>

<p>刚到新地方的时候，大家都很兴奋。第一天音响开的很大，震的屋子乱颤。而写服务器的 ten 是个极需要安静的人，有点噪音就干不下去活。最终，立下了规矩，大家一律带耳机，上下班都不准用音箱。呵呵，我配的机器是个例外，有一对音箱。只是我没有听歌的习惯，从来不开它们。其实环境嘈杂或是安静，我都无所谓，估计是耳朵对声音不敏感，也怪不得我五音不全，不爱唱歌了:) 。其实大多数程序员还是需要一个安静的环境吧。</p>

<hr />

<p>micro 有一间小的办公室，他是游戏部门的头儿，也是《大话西游》的项目经理兼产品经理。办公室里有六张桌子。我不记得还坐了谁，应该不只 micro 一人，但也没有坐满。他有时候出来转转，问些问题。我很奇怪项目经理到底应该做些啥，制定每个阶段的目标吗？但我看到的都是些形式。什么时候完成什么全系在负责的那个程序身上（单从程序角度上来看）。做的人慢点，进度就慢了点，快一点，那么进度就快了点。旁人影响不了什么。项目经理在后面嚷嚷，快点快点，加班加班，似乎起不到什么作用。写程序不是记件的活儿，多干一个小时就能达成完成度一分的。</p>

<p>micro 那时也表现出一丝无奈。记得他对我私下里讲过，他很想写些服务器方面的程序，就像他以前做 mud 巫师那样，但是实在是无从下手了。我想那个时候他陷入很多事情里，正如今天的我。不过我现在好那么一点，至少时间上宽松一些，而且多了这么多年的技术积累。</p>

<p>很大程度上，我所能看见的 micro 的工作都是在招人。他向我征询意见，问我对某某的看法，我直言不讳。</p>

<p>刘铁是当时圈子里小有名气的策划了，据说 95 年就混迹于国内的游戏制作圈，新疆人，能写文章能作诗。为人豪爽，特能喝酒。我们第一次见面，他就拉着我灌白酒，喝的醉熏熏便开始豪言壮语。几年后离开网易销声匿迹了很久，我一直听说他在搜狐做《天龙八部》只是产品怎么也出不来。今年，《天龙八部》一鸣惊人，张朝阳扬眉吐气，丁磊垂涎不已。我想此人功不可没。林广利曾经这么评价他，刘铁的思想过于天马行空，想的太多，所以做出来就少。可买下《天龙八部》这个题目，把人限制在一个小圈子里，反而可以让他反反复复研究个透彻，东西也就做的好了。呵呵，姑且听之。</p>

<p>我曾经诧异一个网游（天龙）能憋这么久才出来，等我自己做时，今天回首过去三年，不也一样吗？</p>

<p>萝卜是之后大话2后期的产品经理，到如今已经是游戏部门的领导了。他是那个时候入职网易的。挺偶然，他弟弟在游戏部门做 QC ，他过来看看，觉得不错，就留了下来。第一份工作是做大话的界面设计，偏美术一些，离策划较远。萝卜是游戏部门公认的好人，好脾气。听他聊过他的过去工作经历：自己卖过电脑，做过三星显示器的地区总代。最终赔了钱后又只为学点东西，在家小店面帮人用 photoshop 做平面设计，被人剥削了还乐呵呵的满不在乎。曾经四处游玩，只因到了一处，碰见一拨人吃完晚饭在街上踢毽子，一起玩的开心，就跑去他们公司干了半年 …… 一个随性，谦虚，豁达的人。</p>

<p>还有一人（这里隐去名字，因为要谈点人家的糗事），不拘小节。有天白天我在写程序，旁边传来鼾声，四处寻觅不见。突然身边站起一美女，婉婉而去。原来我们的办公桌的侧隔板和窗台边留有半米距离，刚好能放下一睡袋。平时打地铺，外面看不到，无损形象。估计是夜里工作的晚了，此人白天怀抱女友入睡，一直睡着，mm 才离开。我就这么记住了这个新来的策划。</p>

<p>他成天的在公司，夏天里没回家洗澡。可想而之，这日子久了，周围的人哪堪忍受。后来此人离职，阿姨拿着火钳夹出工位下的拖鞋扔掉，根本无人敢碰。</p>

<p>ten 是个极爱干净的人，每每跟我说起，都捂着鼻子。只要是策划开会需要程序参加，他都勒令某人回家先洗了澡再来。:D</p>

<p>好在我是个百无禁忌的人，跟谁都相处的很好，啥毛病都能忍。倒是没觉得太多不是。</p>

<hr />

<p>天气最为炎热的那几天，我跟果子在弄 client 更新的模块。我设计了一种数据包的格式，其实并不复杂，只是把零碎的数据文件连起来而已。关键在于，我们希望日后的更新可以尽量的不影响旧的数据。因为我们已经预料到以后 client 会频繁的更新。更新包的数据下载，网络带宽是一部分制约因素，而下载更新包后，怎么合并到原有数据文件中也是一个会影响用户观感的问题。</p>

<p>如果让玩家只是简单的把下载的更新数据包解开，然后重新打包进硬盘上的旧数据包中，很可能这个过程会随着 client 的迅速膨胀而变的异常漫长。</p>

<p>所以我优先考虑的是，如何追加新的数据进数据包，而尽量不影响旧数据在硬盘上的物理位置。其次，就是帮助玩家节省硬盘，而不能每次都把新数据追加在老的数据包之后。</p>

<p>这块东西最后是我和果子合作完成的，我设计了数据包的数据结构和更新数据包的规则和方法，他制定了 patch 包的规范，并编写了代码。</p>

<p>虽然当初做的草率，可大体上却是没什么问题。这套系统沿用了好多年，今天网易的新产品还在继续使用。恐怕只有我目前的这个新项目才在翻新重新设计吧。相比很多别的公司的产品，在 patch 更新方面，我想我们做的还是相对不错的。比如 wow ，每次下载完大的 patch 包，打 patch 的时间都远长于下载时间。如果 wow 也一周一个 patch 的出，估计玩家要郁闷死的。</p>

<p>唯一不能被打包的是当时的 UI 系统用到的资源。那些图片、js 文件、超文本等等。本应是有办法的，只是我们没有时间去找。郭斌不想让最终用户可以看到那些 js 文件的源代码，他写了个程序做扰码。把那些发行版中的 html 和 js 都弄的面目全非 :) 。可惜没有解决上百个小文件的问题（js 文件过大后，在早期的 IE 版本上还有些毛病）。</p>

<p>最终大话的发行版安装时，大部分时间的等待都消耗在了 UI 系统的安装上，不停的拷啊拷啊的。可能那些扰码还有点浏览器兼容性故障，有些版本的 IE 会时不时蹦出脚本出错的对话框。</p>

<p>我已然意识到用 html 来实现界面的诸多问题了。比如显而易见的内存消耗，IE 控件吃掉了大量的内存。不象我们自己的引擎可以控制内存中的图象让他们压缩存放，浏览器放置那些图象素材时一定是平坦的扔在内存中的，也无法做动态加载。</p>

<p>但是没有时间让我们放弃这一方案，甚至从一开始，这就是个帮我们节省开发时间的方案。</p>

<p>我依旧住在市中心，每天公交车收班后才回家。住在那一带的同事拼辆 taxi 回家，走对路的话，是 28 块，虽然有点远，但路上随便的聊聊就到了。四人一车，我、郭斌和刘国斌。还有一人，此人对日后的网易游戏部举足轻重。Ding dang ，从肖海彤的办公室也搬到了工业园。</p>

<hr />

<p>谢绝转载</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（六）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_6.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=359" title="那些日子（六）" />
    <id>tag:blog.codingnow.com,2008://1.359</id>
    
    <published>2008-05-05T13:09:50Z</published>
    <updated>2008-05-06T06:55:46Z</updated>
    
    <summary>和大部分原创游戏一样，游戏定名总是晚于项目启动的。01 年 4 月我正式入职网易时，大家还并不知道这个游戏会和周星驰的著名影片《大话西游》同名。micro 他们只是想做一个以西游记为背景的网络游戏。这个想法来至于当时有名的 mud 《西游记》。我对国内 mud 的历史没有什么了解。大约知道有《西游记》的巫师（yesi）被招聘进来工作，大家对《西游记》情有独衷并不奇怪。 月心是 micro 的合伙人，也是最早天下的策划。理所当然的承担了新项目的设计任务。因为我对网络游戏本身没有兴趣，所以我对这个人也不太熟悉。倒是和另一个策划私交不错，大猫猫。严格意义上来说，他不是大话西游的策划，进入网易前，我想他的身份多半是一个资深玩家。他以前做什么的也不记得了。不过我倒是很早听过这个人，似乎混迹过 sina 的游民部落和后来的 mop 。他的朋友圈子里的人见过不少，salala 、commando 还有后来加入网易的 ali 等等，大多是做游戏媒体的人。 《大话西游》这个名字是大猫猫的主意，马上得到了大家的认同。一开始我们有点担心版权的问题，丁磊说网易有个董事认识周星驰，而后大猫猫就去香港找星爷去了。两年后，大猫猫离开网易，据说在跟星爷混，不知道现在咋样了。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>和大部分原创游戏一样，游戏定名总是晚于项目启动的。01 年 4 月我正式入职网易时，大家还并不知道这个游戏会和周星驰的著名影片《大话西游》同名。micro 他们只是想做一个以西游记为背景的网络游戏。这个想法来至于当时有名的 mud 《西游记》。我对国内 mud 的历史没有什么了解。大约知道有《西游记》的巫师（yesi）被招聘进来工作，大家对《西游记》情有独衷并不奇怪。</p>

<p>月心是 micro 的合伙人，也是最早天下的策划。理所当然的承担了新项目的设计任务。因为我对网络游戏本身没有兴趣，所以我对这个人也不太熟悉。倒是和另一个策划私交不错，大猫猫。严格意义上来说，他不是大话西游的策划，进入网易前，我想他的身份多半是一个资深玩家。他以前做什么的也不记得了。不过我倒是很早听过这个人，似乎混迹过 sina 的游民部落和后来的 mop 。他的朋友圈子里的人见过不少，salala 、commando 还有后来加入网易的 ali 等等，大多是做游戏媒体的人。</p>

<p>《大话西游》这个名字是大猫猫的主意，马上得到了大家的认同。一开始我们有点担心版权的问题，丁磊说网易有个董事认识周星驰，而后大猫猫就去香港找星爷去了。两年后，大猫猫离开网易，据说在跟星爷混，不知道现在咋样了。</p>
]]>
        <![CDATA[<hr />

<p>初到广州的那段日子，虽然工作比较紧张，但是进行的有条不紊。我绝不主动过问游戏方面的事情，只做 engine 。这一快其实没太多东西好做，至少我的进度比大进度要来的快。大都是早就深思熟虑过的东西，只需要把细节完善一下，补上缺少的模块就好了。偶尔有些技术点要攻克的，突击几个晚上，剩下来的大多数时间，并不需要加班。</p>

<p>丁磊很喜欢泡酒吧，而公司附近就有许多。他带我去各个酒吧转，介绍一些他认为有特色的吧，和各式各样的朋友与我认识。我想那些朋友于他也只是点头之交，跟我也不会有啥关系，往往记不住名字。他喜欢的吧都很喧闹，比如公司对面的 wine flower ，去的很多。</p>

<p>我不喜欢太吵的地方，不明白为什么有人喜欢。据说是为了放松一下紧张的神经？或是找个宣泄的场所？可我不觉得自己有什么放松和发泄的需要。从来没觉得什么叫紧张，什么叫压力，什么叫累。平常写写程序挺有乐趣的，写累了，睡觉是最好的放松。我也不喜欢用酒精把自己灌的神智不清，思考是人最重要的能力，脑子烧坏了可不太好玩。</p>

<p>不过有时候老丁也专门约些朋友聊天，当然不能去那些需要对着耳边大喊的场所。这就需要找个安静之处喝点红酒。有一次，我们学来了杀人的游戏，一伙聪明的人在一起，玩的特别带劲。后来的几年，我都很喜欢这个游戏，并且自行扩展了诸多规则，几乎每周玩一次，直到腻味。</p>

<p>喝酒的时候，丁最放的开，像一个大孩子。当然他也喜欢在我这样比他小上七八岁的同事面前摆出老成的样子，讲一些道理。但总的来说很随意，他有些别人没有的优点，也有点不至于让人讨厌的缺点。他是个普通人，一个好人。</p>

<hr />

<p>肖海彤曾经跟我提过一次，能不能以后上班也打一下卡，因为公司需要整顿一下风纪。其实，我在北京上班时都很守时的。不过这次，我想了下说，能不能少点约束。胖肖几乎没有考虑就回答，公司得有个规章，但一两个人的例外倒没太大问题，而且对于自律的人，的确也不需要约束。所以我再也没有打过卡。</p>

<p>的确，我自信对的起这份工作。那段时间做了许多事情。没有人给我分配工作任务，没有人告诉我该做什么，项目需要什么。我想，我写点程序会有用，那么就写了，结果也就用上了。一个最重要的模块就是在最初那段时间完成的，一直用了很多年。</p>

<p>昨天提到网游客户端对内存占用量控制的问题。我们定的最低配置要求 64M 内存（实际上，最终放宽到了 96M ）。最占用内存的是那些角色动画。因为希望有好的效果，我决定让所有图片都使用 alpha 通道。这可以让精灵的轮廓和背景融合在一起，没有锯齿。现在这几乎是 2d 游戏的标准配置。但那时，由于硬件限制，采用的游戏并不多。</p>

<p>实现的困难在于处理速度以及内存消耗，尤其是内存。假设一个人物的单帧图片为 64 * 128 像素大小，采用高彩模式带 8 bit 的 alpha 通道，那么这一帧图就会消耗掉 64<em>128</em>3 = 2.5 K 内存。若是有 8 个朝向，做行走的动作，一组动作 8 帧。那么合计的图片量就达到了 1.5M 。这还仅仅是一个人物的一组动作而已。</p>

<p>网络游戏中，由于玩家的个性化需求，以及内容的丰富，我们需要数以百倍的数据量。用 64M 内存储存下这些数据，简直是天方夜谭。</p>

<p>许多人会联想到图片压缩技术，莫说非技术人员，前段时间连我们公司的程序员都在 maillist 上询问，为什么我们公司的游戏都使用自己的图片压缩格式。他极力推荐 gif 和新版的动画 png 。</p>

<p>其实，图片压缩算法往往都是为了节省硬盘空间和缩短加载时间而设计的。进入内存后，这些标准格式大多还是展开为平坦的数据结构 —— 非压缩数据，方便图象引擎处理。而我们亟待解决的问题是内存的消耗。（这个问题到了今天 2G 内存已是标准配置时依然存在，因为暂时还是主流的 32bit 操作系统，虚拟地址空间依旧有限，容不下日益扩大的 client 图象数据。这是 2d engine 需要处理的一个难点）</p>

<p>我的解决方案是设计了一种可以把解压过程推迟到渲染时再进行的压缩数据格式。原理很简单，RLE 行程压缩算法而已。只是让数据结构组织的更适合实时解压。甚至比不压缩的图象数据处理的更快（因为总的数据量减少，降低了内存总线带宽的需求）。图象也采用了 8bit 调色盘技术，对于 alpha 通道则只保存轮廓线的少量部分。</p>

<p>即使《大话西游》的后继维护人员意识不到，我自己倒是觉得早期的这些精打细算，在内存占用和 CPU 处理速度上的平衡估量，为日后的资料片连续推出铺平了技术道路。策划们肆无忌惮的向资料片里添加素材时，client 不至于膨胀的过快。我们的最低硬件配置要求可以随着玩家的硬件水平提高，需要控制的只是不要增长的太快就行了。《大话西游》一直可以在低配置的机器上流畅运行（包括同一机器上多开客户端，多重登陆，针对这些，我也花了些工夫优化），是它可以顺利推广的一个原因。</p>

<p>图象格式设计好之后，渲染代码花了半个月实现。并额外用了半个月时间用汇编重写，在当时的机器上较之 C 版本提高了 1.5 倍的速度（如今的机器可能差不了这么多了）。图象压缩的工具初版是果子做的，后来我也当学 MFC 而练手做了一个替代品，其中复制了果子代码中的一小部分。如今，网易的许多 2d 项目还在用我那个简陋的工具，点出 about 会看见当年留下的一行字：“云风出品 质量不能保证”。</p>

<p>游戏之作会用这么久，是我编写之时没有想到的，而道理很快就想通了。大多数人都有一种习惯，只要工具还能用，就会一直将就下去。项目开发中，需要做的事情永远比完成了的事情要多，那么只要老的东西还能用，就无心去改进它了。</p>

<p>明白这个道理后，让我以后的工作都特别谨慎。因为写的每一行代码，做的每一个决策，都可以一直被用下去，除非自己想重新来过。指望有人改进它们，是不切实际的想法，即使你在 log 中标上 todo 写的明明白白也不例外。</p>

<p>那个时候，大家还在用 vss 做代码管理。我没怎么用，因为我不太相信有人会来和我一起来共写一块代码。所以我一直自行维护那块相对独立的 engine 部分。稳定了就送去古越那里让他使用。稳定的接口很重要，不至于让大家疲于奔命的重构代码。直到后来做大话 2 时，我才和大家一起移到 cvs 下，一起维护。</p>

<p>那时我对内存的锱铢必较甚至反映到对美术的抱怨上。例如，当时游戏里有四种女娲的形象，其实是用的同一套模型和动作渲染出来的。只是四种颜色，美术人员在渲染时换了四种光源而已。我看到后，抱怨着为什么这样浪费，其实 engine 已经提供了调色盘更换技术，可以方便的用程序做到同样的效果。</p>

<p>最终并没有执意要求换掉这四色女娲。因为我在和大猫猫聊这件事时，自己明白了一个道理。当时他并没有立刻理解我的想法。如果他都没有马上明白，那么，解释给众多人听将是一个浩大的工程。当多人合作做一个项目时，应该为每个参与人员保留最简单的要求和规范。因为一旦项目人多，沟通成本远大于技术成本。一切复杂的手段都是不切实际的。如果真的想按我的想法去做的话，也应该由我自己来写一个额外的程序去自动化处理美术提供的冗余数据（这个案例中，四色女娲共同拥有的模型就是冗余数据），而不是增加制作规范的复杂度（要求美术人员额外去调调色盘，并输出成指定格式，再交给 client 开发人员调用）。</p>

<hr />

<p>老实说，我觉得当时的工作做起来比今天闲的多。白天总有时间在办公室瞎转悠。我喜欢跟同事打交道。不管是不是我的分内的事情，都爱关心一下。我想这也是我的历任上司们都对我的工作放任不管的原因之一。当我的事情做完，总能找出点活儿来做。我在网易乃至游戏部门一直没有安什么特别的职位，手下没有兵，头上没有将。很多东西都是随口问问，看看能不能帮上忙，或是提一些自己的看法。同事们也不会有太多的排斥，反正我不是他们的上司，不会指责他们的失误。偶尔起兴趣了，还可以帮忙写点程序辅助一下。因为我天生看不得有人做重复机械劳动的苦力，宁可自己多花点时间写程序自动化一下，也不愿意见人一整天在那白辛苦。忙的要死，其实没做什么东西出来。</p>

<p>那个时候，游戏的 server 比 client 更晚进入轨道。记得随口问过写 server 的同事（忘记是谁了）的进度。4 月底的时候，他们还在弄一些相当基础的模块，内存分配之类的，让人有点担心。更晚一点，我参加过一次他们 server 组的讨论会，讨论服务器的架构。那个时候，我对 server 开发没什么概念，也没什么兴趣。只是觉得白板上圈圈和连线过于花哨，不觉得有太大意义。最终 dingdang 的加入拍板说，就用单进程单服务器结构好了，这是后话（几个月以后的事情），而且我也记不太清细节了。</p>

<p>micro 挺喜欢让我参加他们的各种讨论会议。这倒不是我特别主动要求，因为开始的几个月，游戏项目不足以引起我的兴趣。</p>

<p>策划的会议参加过一次，乱糟糟的，大家商量游戏里的战斗模式。即时制起先就被我给否决掉了，因为我更喜欢回合制的 RPG 。说起即时战斗模式，我只说 engine 不支持，并摆出大堆理由。其实支持也不是太难，但是我就是不喜欢。而正好当时石器时代正处在上升期，听说已经为华义赚入大量钞票，足够让丁磊流口水的。石器是一个典型的受玩家欢迎的回合制网游，正面典型在前，大家也不怀疑它的潜在用户数量。</p>

<p>剩下的问题是，做一个怎样形式的回合战斗系统。似乎大家都倾向于做的特别一点，比如黄华，当时的另一个策划，提出来要做成在战斗场景上移来移去有方位感的形式。我和大猫猫比较反对，我认为，徒劳增加一些表现力，而不增加对应的游戏系统是没有什么意义的。当时黄华找不到一个合适的游戏系统来支持这种玩法，最后也就作罢。月心是一帮策划的头儿，很沉稳，慢条斯理的，不跟大家吵。他主持了那次策划会议，但没有结论。这可能是我参加的唯一一次《大话西游》的策划讨论会。最终，游戏的战斗系统就是现在这个样子了。</p>

<p>其实回合制的游戏也可以做的丰富多彩，形式多变。我想说，起初大话的策划们也想过很多，只是最终没有实施而已。有很多因素：项目进度、技术因素、硬件限制、等等一些我知道和我不知道的原因。</p>

<p>比较遗憾的是，这么多年，包括我们公司自己的开发团队在内的许多国内开发组，制作回合制网游时，都不敢越雷池一步。在根本形式上少有创新，是让人很可惜的一件事。也许我当年能多点兴趣，支持一些有趣的想法，并做出技术上的支持，在没有定型的网络游戏市场上，会出现别样的回合制战斗形式来。谁知道呢？很多事情也不是一个人可以改变的。</p>

<p>甚至在开发的前两个月，我还参加了一次美术的审核会议。起因是我在调试地图加载模块时，指出了一处场景中的图象错误：有两个建筑的影子方向不一致。其实也不是什么大不了的问题，玩家多半不会在意。micro 决定让我和大家一起统一审一下做好的图。我不是美术人员，也不会跟人争论美术风格应该是怎样，哪里做的不好。但是，一些诸如影子这样的小毛病挑了不少。建筑的力学结构，墙壁上的花纹，哪些植物不应该长在一起之类的。后来觉得这些其实都不太所谓，追究的太多对项目也没多少益处。之后也没再干了，美术的队伍越来越专业和成熟，也勿须我这样的外行插嘴。</p>

<p>那段时间真是过的挺快乐。我对整个游戏开发项目的影响很奇怪，人的职位是属于网易技术部的。游戏项目中名义上的专职工作是做 client 引擎。但实际上做了大量万金油的事情，挺琐碎，以至于自己都记不清干了些什么。就是没让自己闲着而已。</p>

<hr />

<p>早期的那帮同事都混的挺熟。micro 也定期组织大家聚餐唱 K ，我一点不会唱歌，就知道跟人摇骰子。美术部的刘琪周云他们都是爱玩的主，我虽然自己不会晚上主动出去娱乐场所玩，但也不反感有大帮认识的人一起闹腾。哦，古越倒是顾家的好男人，每次我们出去玩，他都不去，要按时回家。这代表了网易游戏开发团队中截然不同的两种性格。我想，一直以来，网易游戏的程序和美术部门都没能完全融合到一起，除了后来的部分行政划分的原因，还缘于最早的这种性格差异。</p>

<p>日子过的挺快，甚至都没觉得项目有什么进展，就这么过了。除了我自己做的那块东西还比较满意，我想我对项目没有信心，当时谁有信心？</p>

<hr />

<p>谢绝转载</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（五）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_5.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=358" title="那些日子（五）" />
    <id>tag:blog.codingnow.com,2008://1.358</id>
    
    <published>2008-05-04T13:49:20Z</published>
    <updated>2008-05-06T06:55:14Z</updated>
    
    <summary>今天已经开始上班了，最近很忙很忙。在调游戏的数值，很繁琐的事情，还要写程序去模拟。整个项目也需要人去照看。 这个系列，我想会坚持写下去。但是不想成为自己的负担，我想这样才能写的自然。因为都是写一些真实发生的事情，和身边的朋友，按记忆按自己的理解去写就好了。不像写小说，会担心有逻辑上的漏洞，会困扰于故事中每个人的结局该怎么安排。所以，挖了坑不知道该怎么填上这种事情多半不会发生的。 已经开始有朋友写 email 跟我聊这几天我写的这几篇东西了，有人抱怨为什么没写谁谁谁 :) 。这个问题其实上次解释过了，我是个不善于回忆和叙述的人，每次从记忆深处挖点东西出来，都会涌出一大堆的人和事。精力有限，只能挑选几个来写。 与其说这是我自己的故事，不如说是国内游戏圈中大家的故事。带着大家从我的眼睛，去看周遭的人。也有朋友抱怨，写的人太多太散，理不清头绪。其实，我也尽力去单独的一段一段描写那些熟悉的朋友，顾而不一定顺着时间的次序让他们入场。 关于国内游戏圈早年的一些事情，有兴趣的朋友可以 google 一下“北外隐形人”写的“中国游戏年代记”。是我读过的最全面的一个记录。从叙事角度看，猜想这个“北外隐形人”是游戏媒体圈子里的人。对于制作圈子来说，有一点点距离。有些东西写的有点偏差，比如 99 年时庞鑫大学还没毕业，不可能结婚的 :) 。同样，我的回忆也可能失实，尽量少写道听途说来的故事吧，呵呵。 一直以来写东西比较随性，有时候节奏慢点，有时候快点，跟心情有关。写这些基本不打稿子，想到哪写到哪。读的朋友得多加忍受了。记下这些往事，不是因为我喜欢缅怀过去，只是发现若再不总结一下，都快分不清好多事情的先后因果了。同时，也是帮身边的朋友们留下点滴，大家一起分享这小段美好的时光。 好了，以下是今天的正文，谢绝转载：...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>今天已经开始上班了，最近很忙很忙。在调游戏的数值，很繁琐的事情，还要写程序去模拟。整个项目也需要人去照看。</p>

<p>这个系列，我想会坚持写下去。但是不想成为自己的负担，我想这样才能写的自然。因为都是写一些真实发生的事情，和身边的朋友，按记忆按自己的理解去写就好了。不像写小说，会担心有逻辑上的漏洞，会困扰于故事中每个人的结局该怎么安排。所以，挖了坑不知道该怎么填上这种事情多半不会发生的。</p>

<p>已经开始有朋友写 email 跟我聊这几天我写的这几篇东西了，有人抱怨为什么没写谁谁谁 :) 。这个问题其实上次解释过了，我是个不善于回忆和叙述的人，每次从记忆深处挖点东西出来，都会涌出一大堆的人和事。精力有限，只能挑选几个来写。</p>

<p>与其说这是我自己的故事，不如说是国内游戏圈中大家的故事。带着大家从我的眼睛，去看周遭的人。也有朋友抱怨，写的人太多太散，理不清头绪。其实，我也尽力去单独的一段一段描写那些熟悉的朋友，顾而不一定顺着时间的次序让他们入场。</p>

<p>关于国内游戏圈早年的一些事情，有兴趣的朋友可以 google 一下“北外隐形人”写的“中国游戏年代记”。是我读过的最全面的一个记录。从叙事角度看，猜想这个“北外隐形人”是游戏媒体圈子里的人。对于制作圈子来说，有一点点距离。有些东西写的有点偏差，比如 99 年时庞鑫大学还没毕业，不可能结婚的 :) 。同样，我的回忆也可能失实，尽量少写道听途说来的故事吧，呵呵。</p>

<p>一直以来写东西比较随性，有时候节奏慢点，有时候快点，跟心情有关。写这些基本不打稿子，想到哪写到哪。读的朋友得多加忍受了。记下这些往事，不是因为我喜欢缅怀过去，只是发现若再不总结一下，都快分不清好多事情的先后因果了。同时，也是帮身边的朋友们留下点滴，大家一起分享这小段美好的时光。</p>

<p>好了，以下是今天的正文，谢绝转载：</p>
]]>
        <![CDATA[<hr />

<p>四月的广州，天气不错，甚至有点夏天的感觉。几年后，一个毕业实习生也是这个季节来到网易，住在我的家中。记得他曾感慨的说，知了怎么这么早就开始叫了，这里连空气里都充满着夏季的味道啊。我想那时我也是这个感觉，到处都是湿湿的，身上有点腻。和北方那种干燥真是截然不同呢。</p>

<p>网易的办公室在写字楼的顶楼，从卫生间门口的通道走出安全门，可以顺着外墙铁扶梯爬上天台。我很喜欢那里，吹着风，俯瞰繁华的广州。偶尔也有人出来抽根烟，我从不抽，但也不用担心吸二手烟。大家偶尔聊上两句，很惬意。</p>

<p>办公室里很拥挤，我想是因为新加入一大帮人的缘故。虽然额外租下了楼下第 18 层，但是没有多少改善。按网易一贯的风格，大家都坐在敞开的大办公区里，隔板不高，方便交流。我被安排在一角，前后都是原天夏工作室的程序。</p>

<p>micro 对于我能再次回到广州很高兴。兼职期间我写的那些模块尚未用上，因为毕竟那些是我自己的一些新想法，还没有和其他人沟通。client 的程序定下来三人，古越、我和果子。</p>

<p>果子，以我当时的眼光去看，是天夏的程序中编程水平最高的一人（不过他不是天夏的股东）。跟着天夏进入网易。第一天我们似乎讨论的是游戏中 UI 的问题。除了“天下”，大家都没有做过游戏，不知道游戏里的 UI 该怎么实现。果子给我看了几个用 gdi 写的 UI 小 demo ，做的不完整，也没有什么头绪用到游戏里。</p>

<p>接下来一两个月，UI 的问题也困扰着我。如果 engine 是由我负责的话，这种 client 的基础设施就理当给出一个解决方案。而我只有一点单机游戏的经验，在我的头脑中，游戏的 UI 都不复杂，简单的硬写出来就够了（比如古越在“天下”中干的那样）。但是直觉又告诉我，网络游戏会不一样，UI 的复杂度会高上一个数量级，不能简单对待。事后证明，我的直觉是正确的。大话西游 client 后期工作一半以上都是围绕 UI 展开的。</p>

<hr />

<p>我在北京时，自学过一小段时间的 javascript 和 css ，曾惊叹于 web 页面可以达到如此的描述能力。虽然那个时候还不曾听说日后日趋成熟的 ajax 技术，但是我想，总有一天 web 页面上也会出现相当于传统客户端程序那样复杂的应用的。</p>

<p>网易有的是做这方面的技术人才，比如郭斌。我发现这个家伙对 javascript 很熟时，就老是跑过去缠着他问些相关的东西。比查 msdn 好用多了 :) 。郭斌这个人不错，听说对丁磊很是崇拜。所以很想安心在网易做一番事业。据说他入职网易后，立刻就结婚买房，在广州安家落户，一心做下去了（听人转述的）。</p>

<p>接触了好些新同事，以及评估了我们的进度计划日程后，我下了一个决定。这个日后反复被丁磊拿出来损我，当作是人都会犯错误的样本来教育新程序员的决定，我至今不认为它是个错误。那就是，在 client 中内嵌一个 IE ，实现游戏中的 UI 。</p>

<p>当时的计划是在 2001 年 9 月 15 日推出游戏。虽然我不认为 5 个月可以完成，但是我想我们的时间终归不是太多。一群没有多少经验的人做这样一个项目，没有多少头绪的情况下，找到任何一个可以分割项目，让它成为独立子项目的方案都是可行的选择，即使有技术难点，也是可以独立克服的。何况网易有许多做 javascipt 的熟手，甚至有成熟的 web 聊天服务，这些都是可以尽量利用的。</p>

<p>软件项目并不是人多就可以做的更快，《人月神话》里已经讲的够透彻了。让更多的程序员可以参入项目并做出贡献是非常困难的，比跨过特定的技术门槛更难。大多数情况下，增加人手只能帮倒忙。而这次，我们可以拉郭斌甚至更多网易的同事（后来做这一块时还加上了刘国斌）来做。而我们 client 组原有的三个人，可以专心于更小的一块工作。</p>

<p>为了嵌入 IE ，我花了不少精力做研究。那段时间读了 COM 的书，看了 ATL ，学到不少知识。不过最终问题并没有很好的解决。在那些紧张的日子里，留给我的时间不多，我不知道怎么做这些。不知道怎么从程序中直接拿到 HTML 页面上的鼠标键盘事件。最后是果子想了一个我们都公认很愚蠢的办法。写一个额外的控件注册进系统，在 javascript 里向这个控件发消息，然后由控件转发进我们的主程序。这个方案明显不符合大家的审美观，但是我有更多的事情要做，其他人也是。它可以工作，那么就那样了。</p>

<hr />

<p>同期，我做了一件影响了后面很多年网易游戏 client 开发的事情。那设计游戏地图的数据格式，以及开发期这些数据的构建方式。</p>

<p>之前，几乎所有的游戏，都需要做一个场景（地图）编辑器。被业内简称为“地编”的工具，往往担负了超过一半的程序工作量。在我大学还没毕业的时候，曾经去珠海金山拜访朋友。剑侠情缘2 的主程王炜给我展示过他做的地图编辑器：游戏即编辑器，编辑器即游戏。发行给玩家的版本只是一个屏蔽掉编辑功能的编辑器而已。</p>

<p>这种方式并非不好，我也曾想这么做一个。但是时间不允许。所以我想到了另一个方法，直接出整图。</p>

<p>整图的方案不是没人干过，但是很多人做的不好。因为出整图是需要占用运行期大量的内存资源的，在当时的机器配置下，就不可能把场景做的太大。而且场景上一样有许多素材会和人发生前后遮挡，也需要编辑器去编辑他们。</p>

<p>我的思路很简单，能不做的工作我们就不做。如果只是描述一个 2d 场景，那么 photo shop 可以干的足够好，而且美术人员习惯用。遮挡关系的处理，我发明了一种简易的方法，用一个 mask 罩住背景图片，当角色需要绘制在后方时，engine 把背景上 mask 罩住的部分扣出来重新盖在角色图片上。这样，我们只需要做一张整图就够了。mask 也只需要用 2bit 描述一个像素（如果单单需要把场景上的一颗树这样的图素扣出来，mask 只需要 1bit 。但还需要一些额外信息描述前后关系，细节这里不展开介绍了），这些信息还可以很方便的压缩。我们需要额外设计的是，如何在 photo shop 里表达出这种 mask。最终的方案是为每个遮罩物创建单独的图层，选用黑红蓝等颜色区分出来。</p>

<p>这套方案是我在家时就想好了的，兼职期间也一直在做这种特殊 mask 的实现。来到广州后，果子帮我研究了 psd 文档的格式，并写程序提取出相应的 psd 文件中每个图层里的数据。</p>

<p>当每个人都可以专心做特定的一件事，比如美术人员可以专心用他熟悉的工具制作一张大的图片时，工程才能合理有序的进行下去。额外需要做的事情是有专人去勾勒出遮罩，分出图层，按事先约定的规则起好名字。</p>

<p>关于内存占用的问题，如果把整个场景的图片全部载入内存显然是不合适的。假设游戏场景有 6400 * 4800 像素那么大（实际上我们后来设计出的游戏场景比这还要大），单单一张背景高彩图片就要占掉 58M 内存。而我们的设计目标是让 64M 内存的机器也可以流畅的运行游戏。况且，60M 的数据加载也是个大问题，我个人作为一个玩家，非常痛恨游戏中缓慢的加载进度条。</p>

<p>最后，我决定尝试分割游戏场景数据，采用运行时动态加载的方式工作。经过测算，为了达到目标，为场景数据预留的内存不应该超过 12M 。我把图片和其它数据拆分成 320 * 240 的小块，当玩家操作主角奔跑于游戏场景中时，engine  根据他的移动方向，预估 client 即将需要显示的场景，最多会把 5 块预读到内存中（游戏的分辨率被固定在 640 * 480 高彩模式）。</p>

<p>为了提高加载速度，我权衡了 IO 速度和压缩图象的解码时间。结论是，如果直接保存未压缩的图片在硬盘上，以当时普通的硬盘，绝对做不到流畅的无缝读取（玩家移动于存在于内存和外存中场景块之间的缝隙）。如果使用高压缩比的压缩格式，比如 jpeg ，又会占用太多的 cpu 时间，同样会影响游戏感。最终我稍微改造了 jpeg 的数据格式，并简化了解码流程（牺牲了一点图象质量），使用大学期间自己用汇编写的一个 jpeg 解码器解决了这个问题。</p>

<p>地图加载这一块使用的多线程技术。不知天高地厚的我，没有任何多线程实战经验的情况下，开始编写这块代码。多线程编程出现的各种问题把我折腾的头昏脑胀，难度远远超过预想。前后花了 1 个半月时间才基本稳定下来。事实上，还遗留了一些 bug 。当程序崩溃时，地图加载的模块会蹦出一个对话框，标题栏上是我挑选的最喜欢的几句《大话西游》电影中经典台词中随机选出的一句。如果还有大话1的第一批老玩家读到这里，应该能想起早期那时不时蹦出的对话框，“悟空，你又调皮了”。</p>

<p>不少玩家曾经猜想过那些句子背后的含义，甚至有人投诉过网易，程序出错还蹦个对话框羞辱玩家  。哈，借唐僧的口我自嘲而已。</p>

<p>当这段代码最终稳定下来，已经惨不忍睹。后来很多年，我们几个产品轮替，大多数代码被重写。但一直没人敢把这块东西推翻。据说这两年做大话 3 的同事终于下决心重新弄了一遍，不简单啊。不过也有一定原因是，我们现在不再需要那么精心推敲内存的占用，硬盘的加载速度了。当硬件上升一个档次，程序员们就可以站的更高，在更高的层面考虑优化问题，反而让系统工作的更好。</p>

<p>当年 windows 95 就是一个例子，微软为了能让它在 4M 内存的机器上跑起来，颇费了一番工夫。结果也严重的制约了操作系统的发展，windows 98 ，windows me 走了不少弯路。直到 windows 2000 才回归正轨。</p>

<hr />

<p>那段时间，感觉新加入网易的众多人都处于一种复杂的心理中，不知道未来，焦躁，不安…… </p>

<p>这与大环境有关。nasdaq 股市爆跌，网易生死不明。高层似乎也发生了几起人事变动。刚进网易时，我参加过一个大型的会议，CTO 给大家讲话，抚慰大家的不安，我刚刚去，不知道是些什么。</p>

<p>后来传出一些谣言，说是公司会被并购，中华网或是金山，具体是哪家公司我已经不记得了。那几天，nasdaq 上的 ntes 涨到了 2 美金。似乎古越和 micro 都挺高兴，还说要出去喝酒庆祝一下。我想是因为他们手头上卖掉天夏得到的一些网易股票。我没去跟着庆祝。不久以后，股价又跌了。</p>

<p>公司有 7000 万美金的存款，但市值已不到这个数字。也就是说，如果有人肯掏上几千万，就可以立刻拥有银行里超出他付出的现金额。但是这是个赔钱的公司，每一分钟都在花钱，7000 万看起来很多，可总有花完的一天。</p>

<p>记得刚去网易没多久，美术的负责人刘琪曾经去我家坐过，随便聊聊。虽然没明说，但我能感觉到他的一丝不安。刚换公司的人大多这样，内心不安定。如果这个团队散了，如果游戏做不出来，如果游戏做不好，大家需要一条退路。我不需要退路，我只是做我应该做的事情，尽可能做好，这就够了。如果尽了全力却失败，非人力所能阻挡。</p>

<p>人的能力有限，其实每个人能做到的事情都差不多。就看你投入多少。如果你全心投入也做不了，那么换一个人基本上也不可能做到。</p>

<p>我想我要做的是解决团队里暂时无人有精力去解决的一些技术问题。还有有些问题大家觉得无所谓（比如运行效率，比如内存消耗），但是我却认定它们会对未来游戏运营起来有影响，默默的去做。不需要别人知道你做了些什么，但求以后没有人指责你做错了什么。</p>

<p>项目的成功正在于：少犯错误。</p>

<p>我的想法就这么简单。所以身再累，心不累。每天还可以很有规律的干些别的事情。比如爱上了飞镖运动。跑遍了广州买到了镖盘和钢制的飞镖，挂在屋子里。每天晚上练习。没过多久，就能连续投中 20x3 的那块小区了。</p>

<hr />

<p>后记：</p>

<p>这一篇本来预备了很多内容，甚至连项目定名都没写（下篇补上）。因为在项目筹备期，有很多的人和事应该记录下来。大话西游是个很多人合作的大项目，不是哪一个人或几个人的功劳。我在这段不长的时间也解决了好几个技术问题，鉴于写太多技术上的东西会让故事过于枯燥，我想，还是分开成几篇来记述，一次提一点，同时可以留下篇幅写一些人，一些朋友，一些我的生命中的匆匆过客。</p>

<p>前面有朋友留言说，故事节奏太慢；又有朋友跟我说，还可以写的再慢一些。我比较偏向后一种观点，多记录些细节吧，可能更有趣。对喜欢快节奏的朋友只好说声抱歉了。</p>

<p>希望能够写完写清楚，又不至于太过冗长。</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（四）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_4.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=357" title="那些日子（四）" />
    <id>tag:blog.codingnow.com,2008://1.357</id>
    
    <published>2008-05-03T05:24:27Z</published>
    <updated>2008-05-06T06:54:50Z</updated>
    
    <summary>2001 年的春天，我用 C++ 把“风魂”重写完毕。这个工作在北京时开了个头。起初是和余雪松聊 kele8 的 engine 时，萌生的一些想法。老余告诉我，他做过一些评测，发现大部分 CPU 时间消耗在了 flip backbuffer 上，大约占 50% ，其次是字符串的处理。（后来这一块的优化，我离开北京后老余也做了，应该是和我的思路类似，做过以后，就能发现更多可优化的热点） 我考虑了几天，突然有了些灵感。我想我找到了方法解决这个问题。只是古老的脏矩形算法而已，好多人尝试过，可惜都没有用好。我想我可以换条思路解决的好一些。 再就是阅读了 MFC 中 CString 类的源代码。因为吴东黎说，好多人不用 MFC ，但是离不开这个 string类。他把这个类从整个 MFC 中剥离了出来用。我也不用 MFC ，不过还是想，有这么好用吗？随即读了一遍。因为正好在重新学习 C++ ，我就自己开始写一个 string 类。 这两块东西让我把“风魂”的代码用 C++ 翻新了一遍。如今回头来看，代码很混乱，没有章法。但是我想它们见证了自己的历史，至今仍放在主页上供人下载。 没有哪个程序员的代码一开始就能写的成熟稳健，我们都经过幼稚的年代。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>2001 年的春天，我用 C++ 把“风魂”重写完毕。这个工作在北京时开了个头。起初是和余雪松聊 kele8 的 engine 时，萌生的一些想法。老余告诉我，他做过一些评测，发现大部分 CPU 时间消耗在了 flip backbuffer 上，大约占 50% ，其次是字符串的处理。（后来这一块的优化，我离开北京后老余也做了，应该是和我的思路类似，做过以后，就能发现更多可优化的热点）</p>

<p>我考虑了几天，突然有了些灵感。我想我找到了方法解决这个问题。只是古老的脏矩形算法而已，好多人尝试过，可惜都没有用好。我想我可以换条思路解决的好一些。</p>

<p>再就是阅读了 MFC 中 CString 类的源代码。因为吴东黎说，好多人不用 MFC ，但是离不开这个 string类。他把这个类从整个 MFC 中剥离了出来用。我也不用 MFC ，不过还是想，有这么好用吗？随即读了一遍。因为正好在重新学习 C++ ，我就自己开始写一个 string 类。</p>

<p>这两块东西让我把“风魂”的代码用 C++ 翻新了一遍。如今回头来看，代码很混乱，没有章法。但是我想它们见证了自己的历史，至今仍放在主页上供人下载。</p>

<p>没有哪个程序员的代码一开始就能写的成熟稳健，我们都经过幼稚的年代。</p>
]]>
        <![CDATA[<hr />

<p>古越在网上告诉我，他想用我新完成的风魂 C++ 版本来写新项目的 client 。不过还需要我做几个扩展模块。我想总是要练练手的，何况可以拿兼职工资。在家这么混下去，总不能一直吃爹妈的。古越还是想让我加上 Z-Buffer 的支持，但我觉得那不是一条正确的路。想了一下，决定实现另一种解决 2d 场景中前后遮挡关系的方案。可以不增加太多额外的数据量，而且处理速度比较快。</p>

<p>在此之前我估算了一下整个网络游戏 client 需要的图片资料的数据量，得到一个吓人的数字。对于当时主流的 64M 内存配置来说，不花点心思，是跑不起来的。</p>

<p>大约做了一个月，我把一堆代码和几个 example 提交给广州，并拿到了 4000 块的兼职工资。这让我很欣慰，至少我在家没有白吃白喝。而且，天夏被网易收购以后，micro 明显大方多了，呵呵。</p>

<p>这种悠哉悠哉的日子也只过了这么一个月。另一个人找到了我，胖肖，肖海彤。</p>

<p>肖海彤这个名字，96 , 97 年的时候在 cfido 网上很出名。我老在全国的技术区里看他发信，有过一些笔谈的经历。写程序这行当，他绝对是我的前辈。那些天，我们在网上聊了许多，他直言是因为网易才跟我联系，但我们聊的都是些别的。我记得他给我转了一些旧邮件，关于民主啊宪政之类的。我本不关心政治，可读了后对政治也有了兴趣。我想我是从那个时候开始仔细考虑“自由”和“个人意志”这些问题的。</p>

<p>肖海彤是丁磊的同学。网易当时还设有 CTO 这个职位。CTO 在北京，似乎跟广州有隔阂，基本管不到广州来。肖海彤正负责广州网易的技术部门，广州也几乎是网易全部的技术力量所在地。</p>

<p>丁磊一定是受不了我们这么一天天闲聊，没过几天就直接给我打了个电话。我想丁磊的口才并不出众，至少当时对我没有什么特别的感染力。只是我在家待的实在是有点无趣了，我说，那我去广州帮帮 micro 的忙，不过我想自由一点。丁说没问题，帮你在公司附近租套房子，有阿姨帮你打扫卫生，屋子里也配好电脑，上班不用打卡。就这么定了，机票明天 ems 到。</p>

<p>事实上，后来我只让阿姨去我那打扫过一次卫生，而我自己连周末也是泡在公司里。我想既然要做，就一定要做好。</p>

<hr />

<p>网易 97 年成立，当时只有 7 名员工。当 2001 年 4 月 8 日，我在入职单上签字的时候，工号是 92 。员工离职，工号是保留的，即使日后再回来，也是领个新的号码。我认识好几个离开网易又回来的同事。而我的工号，从 92 到 0092 再到 G0092 ，没怎么变过。</p>

<p>我猜，当时网易的北京上海广州三地的正式员工加起来差不多只有五六十人吧。但实际上办公室里看起来的人更多一些。micro 他们天夏的收购手续还没有完全办完，许多人拥挤在 36 楼，而我是直接入职网易技术部的。</p>

<p>在胖肖的办公室里，他满是歉意的对我说，由于制度上的原因，只能给我一万一个月的工资。因为我的级别是 6 级，在新员工里已经很破格了，如果再高恐怕影响不好。而 6 级员工薪资最高这么多。至于住房，房租是 1600 一个月，如果公司来支付的话，手续上不好办，所以得我自己承担，额外会有 800 一个月的住房补贴。扣完税以后，可能比一开始许诺的少许多。</p>

<p>我说无所谓的。这么说也真是这么想。而且，这个数字听起来不错，5 位数耶，可以小小的满足一下虚荣心。这也是我最后一次关心自己的薪资，后来再也没注意过。直到今天我也不知道到底每个月公司给我发了多少钱，银行的户头上从来没刻意去查过帐。</p>

<p>入职的那一天，天夏的 fishman 离开了。我跟他就那么一面之缘，没什么印象，也没太多好印象。我在 36 楼底下的农行办工资卡的手续时，天夏原来的行政 mm 也在，她跟着 fishman 离开。很清秀的女孩，漂亮，所以印象深刻。她也是在那办些公务，或许是转帐吧。我们闲聊了几句。我知道网易大约花了 10 万美金收购天夏。今天看来这个数字很便宜，但在那个时候，我想至少 fishman  觉得赚了。我也觉得赚了，就这么忽悠一下，然后全身而退。人和人的想法还就是不一样呢，有人就想做点事情，有人就想赚点钱。</p>

<p>赚钱为了什么呢？我仔细想过这个问题。钱是一种媒介，代表了一种对社会资源的调动能力。所有的不公平，都是缘于资源分配。我们需要有思想有能力的人来更加合理的调配社会资源。</p>

<p>晚饭是丁磊请客，在隔壁的蕉叶吃泰国菜。丁是个没有架子的老板，略微有些霸道。饭桌上还有 dingdang ，跟肖海彤一个办公室的。我们聊起来挺投机。其貌不扬，据说应聘网易时失败了几次，不得伯乐。我看是因为过于谦虚了的缘故吧 :) 。我们聊到我的个人主页，说起 N-SPACE 这个网易的产品，很可惜，那个时候已经停止注册了。dingdang 说其实应该好好弄下去，后来网易的个人主页又开放注册了好长一段时间。</p>

<p>夜里，我回到了属于自己的小窝。就在公司对面的一条小巷子的尽头。与外面的繁华截然不同，这儿非常的安静。一对和善的老夫妻租给了我，虽然外观破旧，但内部温馨，甚至有一口金鱼缸。</p>

<p>很累，床很舒服。第一次一个人住这么大一间屋子。当从清脆的鸟叫中醒来，赤脚踩着清晨地板上的那一缕阳光时，我想这是一个新的开始。</p>

<hr />

<p>五一假期快过完了，不知道忙碌起来还能有多少时间继续写。</p>

<p>照例补充一句：谢绝转载。 :)</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（三）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_3.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=356" title="那些日子（三）" />
    <id>tag:blog.codingnow.com,2008://1.356</id>
    
    <published>2008-05-02T05:13:20Z</published>
    <updated>2008-05-06T06:54:24Z</updated>
    
    <summary>2001 年新年过的很忙碌。我想从大学里毕业出来的学生，第一个新年都是如此。从学校迈入社会，什么都很新奇，想和人分享自己对这个世界新的看法。大多数老同学不会太快结婚，日后离开祖国的也大多没走。所以新年里，那些儿时的玩伴、少年的同学，都会回到老家。只需要有人说声，“我们聚聚吧”，那么一定是和声一片。那个时候，女生们还不够花枝招展，男生们也没人挺着啤酒肚。 狂欢之后，各自散去。在本地工作的，也开始忙忙碌碌，留下我一人。有时候可以去一下老同学读研的校园，跟他们吃吃食堂，打打台球，听他们聊一下自己的老板，还有一些八卦。我觉得我还存在于这个社会。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>2001 年新年过的很忙碌。我想从大学里毕业出来的学生，第一个新年都是如此。从学校迈入社会，什么都很新奇，想和人分享自己对这个世界新的看法。大多数老同学不会太快结婚，日后离开祖国的也大多没走。所以新年里，那些儿时的玩伴、少年的同学，都会回到老家。只需要有人说声，“我们聚聚吧”，那么一定是和声一片。那个时候，女生们还不够花枝招展，男生们也没人挺着啤酒肚。</p>

<p>狂欢之后，各自散去。在本地工作的，也开始忙忙碌碌，留下我一人。有时候可以去一下老同学读研的校园，跟他们吃吃食堂，打打台球，听他们聊一下自己的老板，还有一些八卦。我觉得我还存在于这个社会。</p>
]]>
        <![CDATA[<p>我想许多人在年老之前，很难有这么一段时光。脑子里什么都没有，没有想做的事情，没有应负的责任，没有什么人什么事让你必须去做点什么。哦，那段时间还发生过点事情。我对追求了很多年的那段恋情绝望了。除了心口的绞痛，不记得什么细节。</p>

<p>有那么一瞬间，我了解到什么是空虚。人在虚空中，四周什么都没有，无所触及。声音也传不出去。不喜欢这种感觉，然后我开始读书。</p>

<hr />

<p>大学毕业以前，我是不读历史的。高中会考，九门课，8 A 1 B ，就是历史那一科得的 B 。我痛恨一切要求背诵的课程，顺带厌恶了历史。当然我数的出夏商周，春秋战国秦汉，分的清六朝五代唐宋元明清。这归功于小时候爱看各种历史演义小说。三国演义就读了四五遍，以至于中学老师还没教到出师表时，已经背的朗朗上口了。不过演义不是历史，对吧 :) 。</p>

<p>我想，给我上历史启蒙课的是柏杨（老人在前几天去世，让我感慨了好久）。我倒是先读的《中国人史纲》再看的《丑陋的中国人》。后来又读了《皇后之死》等等很多很多。还有，在网上追看着的潇水的《青铜时代的恐龙战争》。</p>

<p>第一次发现，其实历史这样的有趣。不是因为有趣的故事，而是人性，以及人性促成的社会。历史总是在重复自己，又总也不会呈现相同的面貌；人总以为自己了解过去，可以回避那些前人犯下的错误，可他们总是掉进同一个坑中。这是为什么呢？</p>

<p>读大学时，我玩过一个游戏《恺撒 3》，更早的版本中学时也玩过，不过没有深入。那天夜里，是一门重要科目考试的前夜。躺在寝室的床上，瞧着他们几个人围在电脑边不亦乐乎。终于，有一关他们犯了些错误，引起了恺撒军团的大规模进攻，无法收拾残局。时间很晚了，因为第二天有考试，人就散了。</p>

<p>我觉得有趣，就试着载入存档，看看能不能扭转乾坤。一个晚上过后，我成功了，白天的考试却挂了。满不在乎的我，爱上了这个游戏。</p>

<p>特别喜欢这个游戏系列，胜过《文明》和《模拟城市》。从这里面，让人体验到了古罗马人到底怎样在生活。虽然只是游戏，许多设定是为了游戏的娱乐性而设，但是就是让人觉得，那种生活方式是合理的，恰如其份的，真实的。罗马城里那些高悬在空中的输水管道，街头的公共浴池，给了我无限遐想。</p>

<p>在家的那段日子，我买了份正版的《法老王》，在家里盖金字塔。看着那些小人在尼罗河泛滥后留下的肥沃的河床上耕种，农闲时大量的人力被调配去盖金字塔。哦，奇迹原来是这么诞生的。这就是文化呀，游戏是多么好的文化载体。</p>

<p>我想做一个承载中国古文化的游戏。</p>

<p>所以我开始啃史记，读资治通鉴，还有一些学术研究方面的书，比如人口，风俗方面的专著。很多大部头虽然只是翻翻，但也觉得自己似乎不那么无知了。不过成天读书，人也显得疲惫不堪，没有人和事管着，一天要睡 12 小时才够。白天也总是睡眼惺忪的。我想，长期这样下去也不行，得有个计划。</p>

<hr />

<p>古越打来一个电话，先是很神秘的说他们找到了投资，说对方是个大公司，暂时还没谈完，需要保密。吱吱唔唔了一下，忍不住告诉我，那家公司正是网易。</p>

<p>聊起网易，倒是让我有了一些兴趣。我的第一个 email 就是网易提供的服务。大多数志同道合的朋友，都是在网易的服务器上建立个人主页之后才陆续认识的。那时觉得网易是中国最大的网络公司，嗯，大公司，据说还在 nasdaq 上了市。</p>

<p>不过我对古越说的网络游戏，没有丝毫兴趣。mud 我怎么都没玩进去，UO 显然不如 diablo 有趣，EQ 就是一群傻鸟在那里围着几个多边形按鼠标，隔一会儿还要坐地板。据说丁磊眼红上了《石器时代》，这个游戏我没玩过，不过看起来也是日式 RPG 的末流产品吧。</p>

<p>我说，现在全中国都在做网游呢，才开始做是不是晚了点？</p>

<p>真的，的确全中国那个时候都在做网游，后来那么多人给《天下》和《大话西游》带上了首款国产网游的桂冠，让我唏嘘不已，真的是成王败寇啊。</p>

<p>那几天，另一个朋友也在和我联系，王华奎（音）。</p>

<hr />

<p>认识王的时候他在金字塔做程序员，书生气质。我那时还在上学，假期里去深圳找他玩儿。金字塔对员工管的挺严，我进了金字塔的办公室的时候，他跟我说老板不在，还没下班，等下班我们出去边吃边聊，现在得坐岗。我看了他先前做的一个网络俄罗斯方块，据说在他们办公室里很流行。甚至因为大家上班打游戏，而被老周给禁了。当时他在做一个网游：《人在江湖》。我想，这是我知道的第一款图形 mud ，至少比《天下》早上许多。只不过更 mud 一些，一个个的小区域场景，正如 mud 中的文字被图形化出来。client 是 3d 的，很早期的 3d ，技术不太成熟，打斗的时候有些简易的动作，但主要还是靠文字拓展玩家的想象力。之前的《江湖》这款游戏很糟糕，所以我对人在江湖也没什么特别好的印象。</p>

<p>晚饭时我们聊了许多，王华奎还叫了几个朋友一起。有一个据说是江湖的程序员，已经离开金字塔了。明显他自己也觉得自己在程序方面没什么造诣，说了一些很搞笑和低级的程序 bug 。反正，江湖这个产品没做好是应该的，卖的很好，不是吗？老周应该挺满意。好象还有个做游戏网站的朋友，说起网站的流量之类的事情，我那个时候的个人主页的流量相对还不错的呢。</p>

<p>因为只有我一个人是学生，大家讨论了一下关于毕业生最喜爱的几个南方热门的公司的情况，比如华为的待遇。我饶有兴趣的听着，没有什么想法。</p>

<p>晚上，窝在金字塔的办公室里看动画片。一个胖子的电脑在放《攻壳机动队》，片子和人都给我留下了深刻的印象，胖子说他叫陈重，人如其名，一下就记住了。他还给我看了他画的《江湖》里的大侠，动作很帅。这个人后来负责了天下二的美术，世界真小。</p>

<p>夜里很晚了，我被带去员工宿舍睡觉。全是上下铺，天气很热，没有空调。桌上的电风扇呜呜的吹着，我觉得比学校的寝室好，因为不熄灯。</p>

<p>上铺是个新毕业的大学生，说是找工作找过来的，没想过做游戏，只是找工作而已，目前试用期，1500 一个月。我随口提了些技术方面的话头，感觉对方很茫然，就把话题绕过去了。心里想，这个世界真奇妙。好多有志于游戏开发的热血青年不得门而入，觉得国内做游戏的公司都是些神圣的地方，很难进入。而另一边，人才市场上随便摆个摊，收几份简历，会写几行程序就来做游戏了。有些游戏产品做不好，还真不是什么奇怪的事。</p>

<hr />

<p>王华奎说他现在东莞有个公司，正在开发游戏。还有，给游戏写剧本的是个名人呢，我跟他提过我喜欢《悟空传》，正是今何在在那里。冲者猴子的名头，我说好吧，我去你那看看，散散心。</p>

<p>南下的第一站是广州，下了飞机是古越接的机，我第一次见到真人，大家很开心的聊着到了公司，micro 执意给我报销了机票。我倒真的没点积蓄，有人报销路费自然是高兴的，不过有点困扰的是该让广州的公司买单还是东莞的。</p>

<p>网易的办公室在广州最豪华的地段。狭窄的街道，高耸的大楼，橱窗里玲珑满目的商品，墙壁的装潢有点陈旧，我觉得我处在电视剧中的香港。办公室就在那个川流不息的十字路口边的楼顶，36 楼，我们一直称呼这个办公点。</p>

<p>透过落地玻璃看那楼下的小车，火柴盒似的，感觉很奇妙。</p>

<p>许多人拥挤在不大的办公区里，micro 给我一一介绍。他们一伙人已经确定并入网易，然后新招了许多人，主要是美术。不过在文件上，大多数人暂时还不算网易的正式员工。大家似乎和老网易的人有点隔膜，我想刚合并的公司就是这样。</p>

<p>聊起美术部门里那些五颜六色的头发，听说还有一段趣闻。丁磊起初很不高兴电梯里有人指指点点，不知道顶楼的公司正在做什么，都是些奇装异服的人。曾经“下令”说，你们把头发剪掉、颜色洗掉，再来上班，结果却不了了之。因为有个白发的哥们道，要么我们都不过来上班算了，一呼百应。</p>

<p>这天我认识了刘琪和周云，都与我同年，小我几个月份。我很奇怪为什么美术部会有两个头儿，不过没问。周云的性格我很喜欢，为人很讲义气，长的很帅，一看就是很得女人缘的那种。多年之后他和我讲他的故事，居然他女朋友最后因为迷上大话而最终分手，网游啊，祸兮福兮 。</p>

<p>晚上我住在古越家，他刚买的新房（我猜是因为天夏卖给了网易，股东都得了些好处吧）。他的女朋友正在武汉读大学，学文的。时值寒假，也住在他那。我随便聊了两句，提到想读读范文澜的《中国通史》，她说她正好在学校图书馆里借了一本，就拿给我去看了。</p>

<hr />

<p>micro 和 ten 说想一道去拜访同行，他们在国内游戏圈里没什么人脉，随我一起去多交一些朋友。ten 是天夏服务器部分的主程，挺有想法的一个人，是天夏工作室的元老了。聊起来就知道是个 mud 迷。我猜想天夏的几个人就是因为 mud 走到一起去的吧，我不玩 mud ，这方面没什么共同语言。</p>

<p>我们乘火车去的东莞樟木头。micro 提了个很奇怪的要求，让我别跟王华奎说他是谁，只说是个朋友。我说，讲了也没关系吧，最后还是从了他的意思。或许 micro  当时觉得，被网易收购的事情还需要保密，不方便说。只是最后让王猜出了他们的身份，好不尴尬。</p>

<p>在樟木头我倒是如愿见到了今何在。只是一面之缘，打了个招呼，没有聊什么。他们在做《不灭传说》，剧本是今何在的《若星汉天空下》。这是个网络游戏，据说主打欧美市场，首先做的英文版。</p>

<p>王倒是风光了许多，两年前他陪着我乘公交逛深圳，与我一起挤火车站的售票厅，陪我买车票。如今他只需要打个电话叫来司机，乘上公司的小车带我们转悠。去到当地一个新开的楼盘，谈起来，说是公司的员工工作满十年都能得到一套房子。从小到大一直住在一排排火柴盒一样死板的社区里。我第一次见到公园般的小区，欧式的花园，清澈的池水，从狮子头样的雕塑里喷出来。环绕着花园的房间，明亮的落地窗。我想，以后一定要让父母住进这样的地方，享受生活。</p>

<hr />

<p>聊到《不灭传说》这个游戏，我从自己老本行的角度提了些技术问题，想知道他们怎么解决的。国产游戏到那个时候还没有什么成功之作，大多数卡在技术上。比如内存占用的问题，王说的很轻松，我们打的是欧美市场，人家早已经普及 128M 内存，不用太考虑这些。我心里笑笑，国内 64M 内存已经挺奢侈了。毕竟那个时候我刚从学校出来，烂机器用惯了。</p>

<p>华奎在饭桌上私下里跟我说，过来一起干吧，一个月工资 7k ，另外再算别的待遇。我说，我考虑一下，但自己知道那只是礼貌。条件挺好，但不是我想要的。</p>

<p>晚上，华奎让公司的行政帮我们在一家四星酒店开了房间休息。我和 micro 一间标间。micro 跟我说，他们想了好久新项目做什么。最后考虑到西游记的 mud 挺有人气，一些做西游记 mud 的巫师也过来了。可能会做一个西游题材的网游。</p>

<p>我说我可以帮忙，但还是想在家里自由一些。反正我主要也只是做引擎，稳定了后就没多少事了。不如给你们再做次网络兼职吧。</p>

<p>就这样，第二天我去了深圳转了转，见了几个老朋友，然后就回家了。</p>

<hr />

<p>谢绝转载 :)</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（二）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/05/passed_days_2.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=355" title="那些日子（二）" />
    <id>tag:blog.codingnow.com,2008://1.355</id>
    
    <published>2008-05-01T05:50:24Z</published>
    <updated>2008-05-06T06:53:55Z</updated>
    
    <summary>我在北京生活了半年。接触北京这个城市要更早一些。大约 85 年的时候去过，一周时间几乎玩遍了北京所有的景点。小时候的记忆特别美好，我在那个时候爱上了北京。记忆中，天安门广场是那么的大，紫禁城的宫殿如此雄伟…… 以至于回到学校时，不知道用怎样的形容词才能形容。 10 多年后，我在学校的机房上网，泡 bbs ，做个人主页，写一些关于游戏的自己的想法。交了许多的网友。大家都是业余的，年轻气盛，想自己做出好玩的游戏。王欣是第一个给我发 email 的职业游戏人。更早的 97 年，国内有两家大的游戏公司，前导和腾图，有如台湾的大宇和智冠。可惜生不逢时，前导做不了大陆的大宇，腾图也远不及智冠。 腾图命中注定的散掉，王欣的八爪鱼工作室从腾图分的出来。98 年，王欣邀请我在假期去北京玩，他把我带进游戏这个圈子。我又有机会站在天安门广场，原来并没有那么大。我想，如果毛泽东纪念馆挪一下地方的话，广场会更宽广一些，和我儿时记忆中的一样。小时候怎么就没这种感觉呢 :) 。 那个年代，我成月成月的逃课，去北京帮王欣做些兼职工作，并听他说些早年北京游戏圈子有趣的八卦，有如今天我给新人说起往事。回忆起来，自己其实什么也没做，似乎又做过点什么，反正最后一次，我拿了一小笔兼职工资。不过没有花掉，因为回到学校的时候，一个同班同学缺钱交学费，我全部借给了他，毕业那天他才凑起来还我。 当然，身在北京，我就有机会四处拜访网友同好。随即发现，其实许多网友都已经专职在做游戏了。有些人后来再没怎么联系，比如曾经在金洪恩做《自由与荣耀》的 3d engine 的 riso ，我还记得他在那个晚上，他抱怨他的后继者让代码从几万行膨胀到十几万；又比如做《独闯天涯》的郭巍，他念叨过来北京前没有钱吃饭，小组里每个人一个冷馒头就可以啃一天，脑子里只想着把游戏做出来 …… 两个很重要的朋友，也是在那段时间见的面 —— 余雪松和吴东黎。我们通过在网易个人空间（当时叫 N-SPACE）交换链接认识的。他们搭档了很多年（直到今天），经历很传奇。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
            <category term="游戏开发" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>我在北京生活了半年。接触北京这个城市要更早一些。大约 85 年的时候去过，一周时间几乎玩遍了北京所有的景点。小时候的记忆特别美好，我在那个时候爱上了北京。记忆中，天安门广场是那么的大，紫禁城的宫殿如此雄伟…… 以至于回到学校时，不知道用怎样的形容词才能形容。</p>

<p>10 多年后，我在学校的机房上网，泡 bbs ，做个人主页，写一些关于游戏的自己的想法。交了许多的网友。大家都是业余的，年轻气盛，想自己做出好玩的游戏。王欣是第一个给我发 email 的职业游戏人。更早的 97 年，国内有两家大的游戏公司，前导和腾图，有如台湾的大宇和智冠。可惜生不逢时，前导做不了大陆的大宇，腾图也远不及智冠。</p>

<p>腾图命中注定的散掉，王欣的八爪鱼工作室从腾图分的出来。98 年，王欣邀请我在假期去北京玩，他把我带进游戏这个圈子。我又有机会站在天安门广场，原来并没有那么大。我想，如果毛泽东纪念馆挪一下地方的话，广场会更宽广一些，和我儿时记忆中的一样。小时候怎么就没这种感觉呢 :) 。</p>

<p>那个年代，我成月成月的逃课，去北京帮王欣做些兼职工作，并听他说些早年北京游戏圈子有趣的八卦，有如今天我给新人说起往事。回忆起来，自己其实什么也没做，似乎又做过点什么，反正最后一次，我拿了一小笔兼职工资。不过没有花掉，因为回到学校的时候，一个同班同学缺钱交学费，我全部借给了他，毕业那天他才凑起来还我。</p>

<p>当然，身在北京，我就有机会四处拜访网友同好。随即发现，其实许多网友都已经专职在做游戏了。有些人后来再没怎么联系，比如曾经在金洪恩做《自由与荣耀》的 3d engine 的 riso ，我还记得他在那个晚上，他抱怨他的后继者让代码从几万行膨胀到十几万；又比如做《独闯天涯》的郭巍，他念叨过来北京前没有钱吃饭，小组里每个人一个冷馒头就可以啃一天，脑子里只想着把游戏做出来 ……</p>

<p>两个很重要的朋友，也是在那段时间见的面 —— 余雪松和吴东黎。我们通过在网易个人空间（当时叫 N-SPACE）交换链接认识的。他们搭档了很多年（直到今天），经历很传奇。</p>
]]>
        <![CDATA[<p>刚在网上认识他们的时候，他们还是业余在做，个人网站上放着一个 RTS 的 demo ，看起来很火暴。</p>

<p>据说早年他们在做别的软件，有个自己的小公司。做完个项目后，分了钱大家去北京散心，看看专业做游戏的公司是什么样子的。去过前导也去过腾图，不是去应聘，只是转转。这些“专业”的公司得到的业余者之评价是：不过如此。跟自己业余做的 demo 也差不多水准。</p>

<p>不过腾图把他们留了下来（有八卦说，前导的头儿追悔莫及）。就是那种很随性的，“不如你来上班吧”，旅人结束了自己的旅途。据说那个时候腾图偌大的公司，已经快散伙了，留了许多半拉子产品，补不完的 bug 。这是我听过国内游戏圈的历史中最传奇的故事，余雪松一个人修补了四个产品，把它们做到基本可以摆上货架。我是听别人转述的，但我相信那不是件容易的事情。</p>

<p>见到老余的时候，他们小组已经接受一家台湾公司的小额投资在做《烽火三国》。小组没做垮，产品上了市，那家台湾公司却先垮了。等我毕业再次来到北京，老余他们跟着谢成鸿在做 kele8 。</p>

<hr />

<p>老谢，用过笔名“小谢”。我们居然很早就有过交情，在我的个人主页创办早期，他给我 email 来了几篇稿子，让我放上去。<a href="http://www.codingnow.com/text/engine1.htm">有兴趣的朋友可以看看怀旧</a> ：）</p>

<p>老谢早期最有名的作品是一个 web 象棋，不需要下载就可以在网上和人对弈。这个东西曾经挂在 sina 的游戏版面很久，我想他是用这个淘到的第一桶金。当然更大的资金注入来至于当时如日中天的联众。btw, 第一次见到鲍岳桥的时候，我有种奇怪的感觉，中学时就在 UCDOS 上看到作者名字，我心目中的名人，原来也是个普通人。这种感觉在碰见求伯君时还有，等到日后见到丁磊时已经没有了。</p>

<p>老余听说我正闲着没事做，甚至也没有收入。他请我吃了顿饭。一共四个人，老谢、老余、老吴，还有我。一家很小的馆子，大家骑着自行车过去，点了些家常菜。2000 年的 9 月，老谢对 web game 充满信心。北京的夏天已到末尾，冬天不远了。当他邀请我去 kele8 的时候，我没有太犹豫。我不知道自己能做些什么，该做些什么。我知道这些朋友都有很好的技术，都有火热的激情，看起来不错，不是吗？</p>

<p>我的工资是 6k/月，第一个月发工资时，信封里装了 5500 ，我没有问，我想是扣了 500 的税吧。工资数字对我是无所谓的东西，真的。大学没毕业时，有个朋友说，来我这里干吧，一年 10 万。我在心里吐了吐舌头，这么多啊，父母为我读大学的学费和生活开销，攒了十年的钱，也不过四万而已；我和庞鑫等哥几个去忽悠风投的飞机上，庞鑫说，别不好意思，以后报自己的薪酬，只管写上五位数；我想我一个月吃饭不过几百块，一年难买两件衣服，能用上几个子呢，真的是无所谓的一件事情。</p>

<hr />

<p>在北京的后几个月，我和安宁（以及嫂子），李民（庞鑫的同学）四个人租的屋子。在西直门外，出门就是北京最著名的西直门立交桥。老实说，并没有传说中的那么恐怖啦，我只迷路过一次而已。论可恨程度，远不及紫竹桥那个，南北不通，每次过都需要把自行车搬上搬下。</p>

<p>房租 2800 ，大约每人摊 1000 。我无所求，所以住的最小的一间。屋内空空，只有一张床和一口箱子。每天早上 9 点起床去上班，逆火的兄弟们在白石桥租的高层写字楼，我在魏公村。都不远，大家骑车即可。我的车是来北京后朋友送的，价值 20 块。没有后档泥板，一下雨，背后就是一条黑线。有一天下班时，魏公桥下没有人也没有车，我被黑暗角落窜出来的交警拦下，闯红灯，罚款 20 。他瞅了一眼我的破车，怎么没有车牌？我很想把车留给他，然后自己走回去。但是我没有，兜里只有 20 块，换了一张罚单。后来离开北京的时候，我把这辆破车停了某个天桥下，一年后等我再次到北京时，车居然还在，口袋里的钥匙也在。</p>

<p>在 kele8 的日子很闲，老谢不知道可以安排我做什么。老余说，等下一个版本，全部交给我来做。我就自己给自己找事情做。我去的时候，办公室里就 7 个人。两个美术，一个专心做 3d 模型，一个只会画平面的东西，但是画的真好。我原以为做游戏需要很多很多的美术，其实不用。合理的调配人力，帮助美术节省一些不必要的机械劳动，两个人也能做很多事出来。</p>

<p>程序算上老谢有 4 个。不过老谢写 java 的，老余写 C++ ，他们技术上合不来，而老余的技术和经验高很多，所以整个底层都是老余在做。吴东黎是个很有趣的人，年纪不小，没谈女朋友。和我一样，成天待在办公室。除了打 quake （技术真的很棒），没太见他玩别的游戏。你不可以说他的技术到底是好还是坏，讨论语言的细节他或许不行，但是他做东西就是来的很快。无论是用什么。他和老余是天生的搭档，余雪松设计出脚本语言，他就拿过来用，用的很好。另外一个哥们也是写脚本的，在 kele8 ，包括以后的大部分程序员都是工作在老余自己设计出来的脚本语言和开发集成环境上。</p>

<hr />

<p>起初，我想写个 C 编译器玩儿。因为我觉得游戏做大了还是需要嵌入脚本，除了 C ，我对别的语言都没什么兴趣。写了一半，我又莫名其妙的喜欢上 javascript 和 css ，觉得设计的挺有趣。实现个 javascript 的解释器也不错，不过也没能实施这个想法。后来我读到了一本书：《 C ++ 编程思想》，海淀图书城里看到的。伫立在书架边，读了一个小时，而后就抱回了家。大约用了 2 天时间，没日没夜的啃，仔仔细细的读完了每一个字。</p>

<p>按理说，读初中那会儿，我就喜欢上了 C++ 。不过我的认识也就停留在了 92 年的国内翻译的一些 C++ 书籍上。2000 年底，《 C++ 编程思想 》这本书对我的冲击很大，我觉得我重新认识了 C++ 。我想我应该把“风魂”重新做一遍，用 C++ 。甚至我还觉得 kele8 的引擎做的不够 C++ ，比如我们应该用巧妙的继承和类层次关系去取代那些函数指针。而且老余那个时候跟我一样，不知道可以用 ->* 这样的操作符去用指针调用成员函数，const 这个关键字也没有被准确的使用，等等。</p>

<p>做产品毕竟不是研究技术，这些都是想想而已。我们只是每天在骑车回家的路上聊聊。</p>

<p>只记得那段时间做了两件事：一是把原来“风魂”里的声音播放的模块移植到 kele8 的引擎中，让那些 web game 能够发声。还有就是做一个台球的游戏的技术研究。</p>

<p>写了一个 2d 下 3d 效果带光照的球面渲染；以及做了一些碰撞方面的 demo 后，真正的 kele8 台球程序还是老余自己重新写的。我那个时候思维总停留在 C 和 C++ 上，用不惯那些脚本。老余倒是对自己的东西使的游刃有余，就在一个阳光明媚的早上，他兴冲冲从包里拎出硬盘，推入活动硬盘匣，给我展示了一晚上的成果：一个台球游戏基本可以玩了。</p>

<p>kele8 的台球这个游戏无疑是成功的。那段日子，我去台球俱乐部里打 snooker ，听到有人谈论它，心里都一阵得意，我也贡献了代码呢。</p>

<hr />

<p>那个冬天还有什么？我给远方那单恋了 5 年的 mm 送了一大束百合，是在她的生日那天，没有留下我的名字。虽然她已有男友，但是后来我依然固执的打了一个月的电话。我本以为那个月的手机话费会爆掉，可实际上也不过 400 块多点。看来我不够疯狂，不知道李民怎样让话费一个月超过 1000 块的。吴东黎给我讲了老余过去的故事。那个时候他们两个单身汉合租，老余的女朋友还没有升级成妻子。一下班，就瞅见他就躲进屋子，到第 2 天早上要上班时，居然还没挂电话呢。</p>

<p>我想我不够疯狂。</p>

<p>在北京过的最后一个冬天，满是落魄。这是种内心的感觉。我觉得对不起给我发工资的人，对不起朋友。我没做出什么更有意义的事情。而大多数人都做的比我好。</p>

<p>2001 年的新年来的特别早，1 月 23 日是除夕，我们的春假放的更早。</p>

<p>事后我想，估计老谢明白我想离开。旧年里最后一个月的工资决定等年后再发。不过我领到了 800 元的新年红包。</p>

<p>我实在不好意思说辞职，因为似乎我没为团队做点什么就要走。回到家，我在网上留了言说想休个长假，好好的想想未来的计划。</p>

<p>每次我觉得对不起周遭的朋友们时，大家都表示出莫大的理解。我真的是一个幸运儿，拥有这样多的好朋友。每个人都能体谅我的自私。</p>

<p>那个时刻，我已打定主意离开北京了。</p>

<hr />

<p>争取在 5.1 假期内多写一点，应该能写到大话西游项目的开始。原本还有很多的人很多的故事可以写，这里略过了许多。比如那些年出没在 sina 游戏制作论坛上的众多 id ：小箭2000 （每年还在给我寄贺卡）、做模拟飞行的黄海、写“我的游戏梦”的指顾江山等等。那两年，在北京我见了许多人，跟许多朋友彻夜不眠的长谈。听了许多故事。自己也经历了许多。</p>

<p>每当我努力回忆一点，就会有如泉涌般的冒出来。甚至让我夜晚睡不着。我想人的记忆其实不会遗失，只是藏在那个角落里，等你努力挖掘的时候自然会蹦出来。</p>

<p>对想出现在这个故事中，却没能露脸的朋友说声抱歉了（我挺喜欢出现在别人的故事中，我想很多人都喜欢）。不是我已经忘记你们，也不是故事里的人对我更重要。我只是随机选择了一些片段记录。</p>

<p>10 年前的事情，真的是很模糊了。</p>

<p>最后，还是那样：谢绝转载。因为不能保证没有记忆的偏差，我希望有机会纠正。</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>那些日子（一）</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/04/passed_days_1.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=354" title="那些日子（一）" />
    <id>tag:blog.codingnow.com,2008://1.354</id>
    
    <published>2008-04-30T14:43:10Z</published>
    <updated>2008-05-06T06:53:26Z</updated>
    
    <summary>明天就是五一假期了，同事都已放假。我不打算在假期加班，因为加班也无事可做，手头上的工作都需要与人合作。 前几天和新同事吃夜宵，大家聊的异常兴奋，我也忍不住开始想当年。当年那些美好的日子，记忆已经很模糊了。我想再过个两年，估计我都不能准确回忆起那些曾经对我影响深刻的日子准确的时间。是时候记下点什么，对自己是一种纪念。 我这人有个优点，选择性记忆，那些不快的回忆很容易随风而去。活在我记忆中的人们，对他们只留下感激。我也曾经爱写日记，很早我就写电子日记，记在自己的机器上，PDA 上，当我有一些不愿意再回忆的事情时，我会个将整个文件加上密码，长长的一次性密码，保证自己只能记住一小段日子。当这段日子过去，密码就消失在记忆中。然后再也打不开这些文字，等到下次更换硬盘，无论我多么的想再看一眼当年的自己，也无能为力，只好把加密过的文件删去。 我想我就是这么成长过来，没有什么挫折的感觉被反复咀嚼，都已经抛在脑后。生命中没有什么不可以失去的，这个道理很早就明白了。我曾经懊恼过丢失了大量的源代码、自以为写的不错的文章、早年的聊天记录、珍贵的日记、数年的电子邮件…… 最后我明白了，一切的一切不过是身外之物，我能拥有回忆中最美好的部分，那么已经是特别幸福了。 不过也正是如此，以下的记录也只能是我努力的回忆。或许因为时间久远，跟真实有所偏差，或许从我的角度只看到的事物的一面，但是、我可以保证，并没有故意在叙述中掺差虚假的东西。 是的，我想讲一个真实的故事，一个拥有数千万玩家的游戏诞生的故事。我并不喜欢这个游戏系列本身，但是我为这个产品自豪。我的代码曾运行在几千万用户的机器上，作为一个程序员，还有什么比这更让人满足的呢？也许有，比如让这个用户数量再扩大 10 倍。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="随笔" />
            <category term="游戏开发" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>明天就是五一假期了，同事都已放假。我不打算在假期加班，因为加班也无事可做，手头上的工作都需要与人合作。</p>

<p>前几天和新同事吃夜宵，大家聊的异常兴奋，我也忍不住开始想当年。当年那些美好的日子，记忆已经很模糊了。我想再过个两年，估计我都不能准确回忆起那些曾经对我影响深刻的日子准确的时间。是时候记下点什么，对自己是一种纪念。</p>

<p>我这人有个优点，选择性记忆，那些不快的回忆很容易随风而去。活在我记忆中的人们，对他们只留下感激。我也曾经爱写日记，很早我就写电子日记，记在自己的机器上，PDA 上，当我有一些不愿意再回忆的事情时，我会个将整个文件加上密码，长长的一次性密码，保证自己只能记住一小段日子。当这段日子过去，密码就消失在记忆中。然后再也打不开这些文字，等到下次更换硬盘，无论我多么的想再看一眼当年的自己，也无能为力，只好把加密过的文件删去。</p>

<p>我想我就是这么成长过来，没有什么挫折的感觉被反复咀嚼，都已经抛在脑后。生命中没有什么不可以失去的，这个道理很早就明白了。我曾经懊恼过丢失了大量的源代码、自以为写的不错的文章、早年的聊天记录、珍贵的日记、数年的电子邮件…… 最后我明白了，一切的一切不过是身外之物，我能拥有回忆中最美好的部分，那么已经是特别幸福了。</p>

<p>不过也正是如此，以下的记录也只能是我努力的回忆。或许因为时间久远，跟真实有所偏差，或许从我的角度只看到的事物的一面，但是、我可以保证，并没有故意在叙述中掺差虚假的东西。</p>

<p>是的，我想讲一个真实的故事，一个拥有数千万玩家的游戏诞生的故事。我并不喜欢这个游戏系列本身，但是我为这个产品自豪。我的代码曾运行在几千万用户的机器上，作为一个程序员，还有什么比这更让人满足的呢？也许有，比如让这个用户数量再扩大 10 倍。</p>
]]>
        <![CDATA[<hr />

<p>认识“古越”还是我读大四下学期的时候（2000 年初）。有一天，他在 QQ 上蹦出来，问我一些“风魂”的问题。我当时上网主要在泡 sina 的游戏制作论坛，“风魂”就是那几年写的游戏之作。</p>

<p>更早的时候，我比较喜欢在 dos 下写点东西。研究一下 allegro 这个游戏开发库。我翻译了 allegro 第 3 版的所有文档（为此还自己做了一个辅助翻译工具），这项工程耗去了很长的时间，从 98 年开始到 99 年中，业余时间我几乎都在维护这个东西。为了翻译不出差错，同时也阅读了大部分 allegro 的源代码，从中学习到了许多游戏引擎的理念。</p>

<p>那些日子，时常在 allegro 的 maillist 说几句话，为一些代码做优化并迅速被 allegro 开发社区吸收进去。同时我也提出了许多自己的想法。不过由于新的想法需要对 allegro 的接口做调整，这是一个成熟的库不可接受的，和 allegro 的原作者 Shawn 通 email 的过程中，Shawn 用很友好的语气说，如果你觉得那样比较好，为什么不自己做一套东西出来？然后我就做了，甚至第一个版本在 allegro 的 mallist 中发布。有人说，这样的东西没什么意义，allegro 已经够好了（当时已经有了 Windows 版）。Shawn 还帮我解释。</p>

<p>哦，我说的就是“风魂”。甚至不到一个月，风魂就有了一个匈牙利用户，他还用它做了一个小游戏。</p>

<p>这是 1999 年 3 月 4 日到 3 月 8 日的事情。我在网吧通宵了三个晚上把风魂的第一个版本完成。之所以日子记的这么清楚，是因为我查到了当年留下的一份记录文档。开发环境是 MSVC 5 ，因为我不愿意（也没有足够的硬盘空间）装 IE4 ，所以没有安装 6.0 的 VC 。</p>

<hr />

<p>“古越”，就是天夏的 client 主程，也担当了后来大话西游1 的 client 主要逻辑的编写工作。那个年代，精通 Windows 写游戏编写的人不多，我也只是稍微熟悉而已。很多人刚从 dos 年代过来不久，DirectX 的中文资料很少，且比较难查到。我很能理解他们选择使用“风魂”这个学生作品的缘故：开源 + 使用简单（简单的 C 接口） + 高效（在硬件条件受限的时候，我在软件优化上下了许多工夫）。</p>

<p>天夏这个小公司当时正在开发一款图形 MUD ，名字就叫“天下”。当时估计有很多 mud 迷想把 mud 图形化，但是做出来的产品寥寥。我只记得有一款叫作“笑傲江湖”的所谓图形 mud ，仅仅只是给文字 mud 加了点图片而已。真正意义上的图形化还没有人完成。</p>

<p>显然，天夏的开发团队也没有前人的经验可以追寻，甚至他们没有开发过单机游戏。忘了当年“古越”问了我一些什么，只是最后，他想请我帮忙做一些模块，可以让游戏开发更简单一点。这个工作是有酬的，这点吸引了我。要知道当时都是穷学生，我连买块硬盘的钱都没有，显示器也已经严重老化（93 年购入的时候已经是国外的电子垃圾，不知道服役过多少年了）， 我的开发机器中的 CPU 是网友的公司赞助的，主板是编程比赛的奖品，内存条这些配件用的先前一些兼职工资买的。</p>

<p>所以，任何一个用自己的技能赚钱的机会都不会放过。这样，我又认识了 micro ，天夏当时的头儿之一，据说他当过 mud 的巫师，也写一些服务器的代码。不过后来我们见过面之后，一起在网易共事的日子里，几乎没见他再写过什么代码，这些是后话了。</p>

<p>我写了一个支持 Z  buffer 的 2d 模块。这样，他们可以简单的处理 2d 游戏中 sprite 的遮罩问题。因为需要让当时配置比较差的机器（486）能跑起来，我尽可能的用汇编优化。这些工作耗费了我一两周的时间。</p>

<p>快完成的时候，我在网上询问了朋友（逆火的庞鑫，他与我同届，但是他在大学期间已经发行了一个游戏了：天惑），庞鑫告诉我说，他们为了养活自己的工作室，时常也接一些单来做。这样的单大约应该开个 1500 的价。当时我天真的觉得，1500 实在是个天价，要知道 97 年的时候，我帮人用 delphi 1.0 做了一个完整的软件也才拿了 600 多点，那个用了我半个暑假。</p>

<p>所以我跟 micro 提的价码是 1000 。有点意外的是 micro 还是觉得有点高了，不过我理解他们的艰辛（当时是一个很小的工作室，没有什么投资，几个人自己在弄），重新核算了一下，把自己花掉的时间统计了一下。按每小时 20 块（比家教的水平高多了，当时就这么想的）得到一个大约 500 的数字，micro 把款打给了我。这就是我和天夏的第一次合作。</p>

<p>btw, 具体的数字我记不太清了，只能说大约这个数量级吧。大学毕业后我就再也没缺过钱用，对钱的数字极其不敏感，所以忘的快。</p>

<hr />

<p>毕业的第 2 天，我去了北京。在创意鹰翔待了三天。林广利是我很好的朋友，我看他似大哥一样。他邀请我去的北京。鹰翔当时的情况看起来不是很好，不过我不太所谓。总算毕业了，我觉得我自由了，再也不用看老师的脸色，不用应付烦心的考试，不用担心课堂点名……</p>

<p>当被问及我们应该重新开始做个怎样的游戏时，大家并没有想到网络游戏，虽然那个时候石器时代已经开始流行。我听到的圈子里的说法是，“目前国内有 200 个网络游戏正在开发，明年至少有 20 个上市，再开始做已经晚了，也没啥意思”。事实上，2001 年并没有那么多国产网游被开发出来，我所熟知的一个：大话西游，可耻的失败鸟 :D</p>

<p>那几天我们讨论了许多，但是不知道为啥，我始终没什么兴趣。我不知道我需要什么，但是我知道那些不是我想要的。</p>

<p>逆火工作室在创意鹰翔对面的院子里，我联系庞鑫出来聚一下的时候才发现这一点。太巧了，北京如此之大，此刻又如此之小。</p>

<p>庞鑫是个典型的北京人，说话极富煽动性（会忽悠？不过人家也的确有真本事）。我 98 年在北京参加一个大学生计算机比赛时，认识的他。他倒不像我是参加编程部分的比赛，而是展出他的 3d engine 。98 年，3d 显卡还是很稀罕的年代，所以我很是佩服。</p>

<p>庞鑫试图说服我加入他们的工作室，跟随一个投资者（yan dan ，那个时候听说很有名，他说他帮过许多人，比如雷军）做手机的软件。据说很有前景。EPOC 系统，我第一次听说，现在已经改叫 Symbian OS 了。我们为 EPOC 做一个 3d 游戏引擎，应该很不错的。我可以做我最熟悉的一块，在 arm 处理器上，用 arm 汇编优化 2d 部分（因为手机当时还不能配备 3d 硬件，都是软件实现，最终都需要转到  2d 显示）以及一些底层核心代码。</p>

<p>安宁（后来为天下 2 写了几年的程序）当时也在那里，我挺喜欢这个人，他曾经用汇编写了一个软件 3d engine 。符合我心目中的牛人标准。</p>

<p>庞鑫的说服工作只用了几个小时就成功了。我给林广利打了个电话，他只是叹气而已，没太说什么。我就直接住进了逆火工作室租的那间大屋子。</p>

<p>那段日子过的挺自在，都是一帮好朋友，住在一起，半夜饿了就打车出去永和喝豆浆。白天叫些外卖。伴晚时分，也出去闲逛。我在北京有很多朋友可以一个个蹭饭 ：）。几乎都是游戏圈子的。比如，最早拉我进入这个圈子的王欣（八爪鱼工作室的负责人）；为无数国产游戏“擦过屁股（修补 bug 并完成游戏好拿出来卖）”的余雪松（可能说起后来的 kele8 大家更熟悉一下）等等。</p>

<p>这段日子一直过到天气开始转凉。我还清晰的记得那一天，有人通知我们第 2 天去深圳见风险投资的公司代表。我们连夜做了 PPT ，赶上第 2 天早上第一班飞机南下。我们只在飞机上打了个盹就被拉到另一个合作的团队的驻扎地。这个团队当时叫做 wass ，后来其主干有建立了家新公司唤作“数位红”，现在好象已经不存在了，不过应该 google 的到。</p>

<p>原来投资商是再后一天从新加坡去广州的。我们在深圳只是再准备一下。这次让我领略了该怎么忽悠风险投资 ：）我们掐着秒表准备演讲内容，甚至连中场休息的笑话都是预备好的。</p>

<p>我的部分不太需要准备，反正不是说大话，怎么想怎么说即可。所以得以有两三小时的睡眠。等天再此蒙蒙亮的时候，我们已经上了去广州的 taxi 。几乎是一睁眼就到了，除了困，我什么都不记得了。</p>

<p>我和庞鑫的演讲部分安排在最后，会议室里，我们拼命的喝着不加糖的咖啡，中间上了三次厕所。我和站在外面吸烟处猛着抽烟的新哥们相似而笑。 40 多小时没怎么合眼。大家都困死了。</p>

<p>投资商是宏基，看起来比较重视，派了个元老过来谈的，带了很多人。我和庞鑫的演说很成功，想来是因为我们年轻，表现的相当有激情，甚至还为技术细节吵了两句。说完了我们就回房间睡觉去了。晚上有人来敲门的时候，已经带着好消息。</p>

<p>虽然我们要求的四百万美刀没有被答应，不过对方还是答应投资 1.5M 。我们这大摊子人一共保留多少股份不太记得了。只记得逆火工作室的哥几个分到百分之十几。</p>

<p>我们需要签四年的合同，合同很厚很厚，回北京后还安排了律师给我们讲解。我觉得学到了许多。只是最后签字前的那一晚，我想了一个问题：这是不是我的追求，我要的人生？</p>

<p>庞鑫曾经跟我说，没错，如果我们有 15w RMB 我们就可以自己干。即使大家现在一无所有，只要有技术，无论做点什么，不需要多少时间就可以赚到这么多钱，然后开始做自己更想做的东西。但是，或许有更好的路，让我们就有更高的起点，节约我们的生命。我知道逆火的兄弟曾经过的很辛苦，《天惑》做了三年多，只卖了五万块 RMB ，而且出版商还拖欠款项很久。但是我没有亲身经历，我不喜欢手机这个开发平台，离我的想法太远。</p>

<p>在那个大屋子里，大家围坐在一起，劝我不要走。我也很犹豫。负责投资的那个头儿接了电话过来，只问了我是否真的想离开。我说，我不确定，但是我知道，这些不是我想要的。这句话，很多年后我又说过一次。每次说出来，都得到了理解。就这样，我离开了这个团队。</p>

<p>下次再接着写吧，我想会一直写到梦幻西游的成功，是个很长的故事，不知道有没有朋友会一直读下去。我只是想记录这几年的历程，没有读者也无所谓。</p>

<hr />

<p>注：本文全凭记忆复述，和事实或有偏差。如以后发现错误之处，会尽量修正。顾谢绝转载。</p>

<p><a href="http://blog.codingnow.com/cloud/PassedDays">那些日子（目录）</a></p>
]]>
    </content>
</entry>
<entry>
    <title>游戏数值公式的表象与本质</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/04/essence.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=353" title="游戏数值公式的表象与本质" />
    <id>tag:blog.codingnow.com,2008://1.353</id>
    
    <published>2008-04-27T15:50:39Z</published>
    <updated>2008-04-27T18:58:58Z</updated>
    
    <summary>周末、睡的比较晚，起的也比较晚。总的来说比平常睡眠时间长一些，所以到了这周一的第一个小时，我还是全无睡意。随便写点什么，关于游戏的，关于游戏设计方面的东西。 鉴于我在游戏设计领域还没有什么建树，远不如游戏程序设计方面有发言权。甚至对游戏设计说三道四的话，还不如在软件开发上乱侃几句有分量。在下充其量也就是个没吃过猪肉天天能见着猪跑的家伙，如果有猪肉已经吃腻味的方家读到这里，请一笑了之，别跟我一般见识。 本来在本文成文前打的腹稿中想举出些实际的例子来，可是发现怎么都会或多或少的得罪圈子内的策划朋友。罢了，只说些空话好了，算我做了半个月游戏数值，闲暇时发的点牢骚。 从为我们的游戏设定角色基础属性，以及设计战斗伤害的计算公式开始。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="游戏开发" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>周末、睡的比较晚，起的也比较晚。总的来说比平常睡眠时间长一些，所以到了这周一的第一个小时，我还是全无睡意。随便写点什么，关于游戏的，关于游戏设计方面的东西。</p>

<p>鉴于我在游戏设计领域还没有什么建树，远不如游戏程序设计方面有发言权。甚至对游戏设计说三道四的话，还不如在软件开发上乱侃几句有分量。在下充其量也就是个没吃过猪肉天天能见着猪跑的家伙，如果有猪肉已经吃腻味的方家读到这里，请一笑了之，别跟我一般见识。</p>

<p>本来在本文成文前打的腹稿中想举出些实际的例子来，可是发现怎么都会或多或少的得罪圈子内的策划朋友。罢了，只说些空话好了，算我做了半个月游戏数值，闲暇时发的点牢骚。</p>

<p>从为我们的游戏设定角色基础属性，以及设计战斗伤害的计算公式开始。</p>
]]>
        <![CDATA[<p>计算机里的一切问题都是数学问题。</p>

<p>这句话可能不太确切，但是目前一切利用计算机解决的问题，都必须先表达成数学形式，我想没有太多人会有意见。计算机游戏本质上也是一段交给计算机运行的程序，必须先转化成数学形式。这个转换过程无论是交给游戏策划来做还是给程序员来做，都无可避免。</p>

<p>转换的过程必然有损于原始设计初衷；策划做的时候往往不太能掌握数学语言，有失准确；而程序员总是刻板的追求形式上的统一，而失去细节（神韵？）。大多数人都趋向于游戏的表象而忽略本质，这不单是某一个人或某一类人常犯的错误。</p>

<p>扯点时间久远点的例子。我们知道中国人比古希腊人更早发现了勾股定理，但是西方人依旧把直角三角形直角边的平方和等于斜边的平方称为毕达哥拉斯定理。</p>

<p>杨辉三角形为每个程序员所熟知（大部分编程入门教材上都会用这个做编程习题），但是数学上，我们用的更多的对应名词是牛顿二项式定理，虽然中国人早了至少 300 年发现它。</p>

<p>抛开民族自豪感这些东西，当我们仔细比较上面两个例子中前后两者对同一数学定理的见解，我们会发现，它们其实是表象和本质的差别。只有我们用演绎的方法证明理解数学定理时，才能看透本质，并做出推广。摆脱事物的表象，用符号工具单纯的研究他们之间的关系，正是我们许多人思维中缺失的能力。</p>

<p>在我很小的时候，读数学科普读物。曾经嘲笑过毕达哥拉斯因为不能理解无理数而杀死他的学生；也没觉得负数是一个了不起的发现，而欧洲的数学家到 16 世界还不承认它。</p>

<p>直到中学时，接触到复数的概念，才觉得数学的神奇。然后回过头来思考，为什么一个小的数字减一个大的数字的结果是负数？负数到底是什么？问这些个问题时，我才明白，绝对不能轻视古人。看清事物的数学本质是件多么不容易的事情。明白自己其实什么都不懂只是一个开始。</p>

<p>扯远了，还是谈游戏。</p>

<p>拿魔兽世界（后面全简写作 wow ）举例说事，恐怕是唯一不容易遭人非议的了。我们注意到， wow 之前有很多网络游戏，甚至暴雪之前也有一款很接近现代网游的游戏—— diablo 的 battle net 版，都采用了一种让玩家展现个性化角色的设计。那就是随着升级，为角色自由分配属性点，再由属性点影响角色的能力。</p>

<p>我可以举出长长的例子证明这一点，甚至电脑 RPG 的鼻祖，D&amp;D ，也是有自由加点的设定的。虽然 D&amp;D 里玩家可以加的点很少，暴雪在 diablo 里加强了这个设计。</p>

<p>为什么在这么多已有的网游中，大家都沿袭了这个设定，把它作为提供玩家个性化的必要手段时，暴雪绝然抛弃了它，把个性化转移到了天赋系统中。是为了创新吗？我不是暴雪的游戏设计师，我没有答案。但我们知道，暴雪从来不是一个以创新为名的游戏制作公司。而天赋树从外观上看，就是 diablo 中技能树的延续。</p>

<p>熟悉 wow 的玩家可能会说，是为了平衡。没错，但这是表象。我们需要进一步看清本质。</p>

<p>前段试玩了一个新出的网游，工作需要。可能是我已经厌倦了 wow ，对 wow like 的东西更提不起精神来。我试图说服自己，我觉得这个游戏比 wow 还无趣，是因为早先年打 wow 打累了。一丁点不如 wow 的地方都会被放大来看，甚至比 wow 做的好的，也会被忽略掉。</p>

<p>在公式化的游戏进程里，我玩到了游戏设计者“体贴”玩家的地方，比如升级飞快，轻松的接交任务等等。但是让我能理解，又觉得不可理喻的地方是，游戏依然保留着“传统”MMORPG 的设定，那就是每次升级都可以自由分配属性点。</p>

<p>亲身体验后，更加坚定了我的想法：自由分配属性点在大多数游戏中是一个极其鸡肋的设定。</p>

<p>或许是大部分游戏设计师认为，我们要提供给玩家一些自由度，而用户接受了自由加点这个设定，那么这就是一个廉价稳定的方案，我们也要提供它，没什么坏处，不是吗？</p>

<p>其实，大多数用户根本不知道他们真的需要什么，只是服务提供商对他们反复强化一些东西，这些东西反过来才成了必须品。在软件行业中，这样的例子比比皆是。“<a href="http://blog.donews.com/keso/archive/2007/07/05/1182818.aspx">不要听用户的</a>”是我去年听到的深合我意的一个声音。当然，千万不要曲解这句话。我从来没有否认过，用户调查，市场分析，等等这些对于游戏开发的重要性。</p>

<p>作为游戏设计人，我们到底想提供给用户多少自由度，怎样的自由度，这些都必须在设计时考虑在内。我们不是神，可以创造出简洁的自然法则构建出如此复杂的世界，任其发展。而且上百亿年了，其中的智能生物都无法完全了解这些规则。</p>

<p>说回属性点自由分配的设计，看似自由，比如一个小角色从1 级到满级可能得到上十点甚至上百点自由分配组合在 4 到 6 个不同的属性上。实际上，真正有用的组合方式寥寥无几。有天真的设计师，指望玩家可以摸索出超出自己想象的自由属性点组合方案吗？如果真的出现了，那么对游戏平衡一定是一个灾难。</p>

<p>如果你有信心对你没有预料到的东西做出合理的判断（不至于引起灾难），那么只有一种可能，那就是你做出了数值背后更深层次的规律的探索。可惜，大部分设计师没有这么做。</p>

<p>总结一下。如果你给了玩家一些自由度，让他们自由组合一些东西，达到个性化的目的，那么在设计阶段，作为设计师的你，就一定要全面列出所有的组合可能，并一一对其审视。</p>

<p>几十上百个的属性点自由分配的组合方案，从绝对数字上说实在是太大了。没有人会一一排到纸上演算。实际上也没有这个必要，因为大多数组合间是有规律的，不至于把量变堆积为质变。大量的组合方案在对玩家来说都是无意义的，没有人会那么组合，除非他犯错误，否则一定能找到一个达到他期望目的（PvP PvE 或者别的目的）的更优解。</p>

<p>从我信奉的 KISS 哲学上看，允许这么多理论上的属性点组合方案本身就是一个错误。如果我们希望玩家有 10 种个性化方案，就应该用最少的元素提供出 10 种这个数量级的变化规则。而不是提供上千种，让玩家从中选出 10 种。网络游戏中，提供自由度而存在的规则和设定不是为了考验玩家的智力（有时连智力都不需要，只需要机械性的忍受力）而存在的。</p>

<p>我相信很多人在接触一款新游戏时，都有过和我一样的迷茫：不知道升级后点该怎么加，只是无谓的犹豫不决，或是干脆一古脑把点全加在最需要的方面（比如物理攻击职业把点全堆在力量上）。</p>

<hr />

<p>再来看看，大家沿袭最多的 MMO 系统，还是暴雪的——装备系统。很多玩家迷恋于装备上 +20 力量，+10 敏捷这些属性点加成。</p>

<p>我想大家在开发网游的时候，也自然而然的把这个系统做进产品里去了吧。</p>

<p>提一个问题：为了暴雪在做的时候，不把 +20 点力量直接写成 + XXX 点伤害力呢？这样玩家不就可以直接知道这个东西对他有什么好处了。</p>

<p>在 diablo 的年代，属性点意味着高级技能学习的先决条件；而 wow 中，同样的属性点，对于不同职业的实际效果反应是不一样的。比如敏捷可以增加盗贼的攻击力，而对战士则没有这样的效果。即使是同样依赖力量增加战斗力的职业，一点力量意味的伤害力的增强也是不同的。</p>

<p>所以，本质上，wow 中属性点到实际伤害计算公式中参量的变换，是为同一装备对不同职业的效能差异服务的。如果 wow 中，每个职业都用他们各自专有的装备，互不影响，那么，属性点的设计就是多余的。至少没有必要展现给玩家看，只让它作为设计战斗公式时的辅助工具就够了。</p>

<hr />

<p>几年前，我曾经跟一个同事争论过一些游戏数值设定的方法。我坚持认为，一切都是数学公式，我们在设计时完全可以用 A B C D E 代替我们想要的东西，甚至一些公式也不用先定好具体函数是什么，而只需要根据最终的需要反过来推导。反正最终都是一些初等函数的变换，不可能跳出大框价。</p>

<p>但是很多设计师总期望先从现实中或是小说设定中找到对应物，非搞清楚为什么力量影响攻击力，根骨导致 HP 总量更长。那些名词到底是什么更为重要。以此可以展开更多的想象。</p>

<p>我说的名词还包括，“法师”、“战士”、“盗贼”、“牧师”这些……</p>

<p>最近我自己在做数值设定了，亲身感受后，果然合适的名词的确能辅助设计。没错，我们总需要借助一些更有意义的词来在头脑中建立起概念。但是，最终我也发现，一旦能克服对这些名词的依赖，纯数学的构建出基本的关系，无偏袒的，只为了数字上的平衡和变化去设计整体的框架。后期再根据需要找到合适的词并套入系统，以此展开细节上的联想，效果可能更好。更能帮助我们跳出玩过的前人的总总游戏的框架，找到新的东西。</p>

<hr />

<p>不知不觉写了两个多小时，实在是太晚了。好象又什么都没写，等以后有闲了再补充一些实质性的东西吧。btw, 今天吃过晚饭后，在夜市上淘到一套对折的《<a href="http://www.douban.com/subject/1958362/">说文解字注</a>》。家里原有一本，是父亲的藏书。读中学时拿出来看，不小心弄丢了。这次撞见，挺高兴的买了下来。说是对折，但价钱还是今非昔比咯。</p>
]]>
    </content>
</entry>
<entry>
    <title>不那么随机的随机数列</title>
    <link rel="alternate" type="text/html" href="http://blog.codingnow.com/2008/04/quasi-random_sequences.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.codingnow.com/mt/mt-atom.cgi/weblog/blog_id=1/entry_id=352" title="不那么随机的随机数列" />
    <id>tag:blog.codingnow.com,2008://1.352</id>
    
    <published>2008-04-21T10:27:27Z</published>
    <updated>2008-04-21T15:17:40Z</updated>
    
    <summary>曾经看过这样一种赌徒的策略：假设在一场赌大小的赌博游戏中，赔率是 1:1 ，而庄家不会出千，开大和开小的概率均等（皆为 50%）。赌徒一开始压一块钱，如果他压错了，那么下一次就压两块，再错继续加倍。一旦压对，赌徒永远可以保证有一块钱的进帐。并且从 1 块钱重新开始。 看起来，这种策略能保证永远包赚不赔。但实际上为什么没有人用这个方案发财呢？ 放到现实中，试图采用这个策略去赌博的人，几乎都会赔的倾家荡产（当然只要是赌博，差不多都是这个结局）。不要怪运气，不要怪庄家出千，因为这个策略从一开始就注定了失败。...</summary>
    <author>
        <name>云风</name>
        <uri>http://www.codingnow.com</uri>
    </author>
            <category term="概率与桥牌" />
            <category term="算法" />
            <category term="游戏开发" />
    
    <content type="html" xml:lang="en" xml:base="http://blog.codingnow.com/">
        <![CDATA[<p>曾经看过这样一种赌徒的策略：假设在一场赌大小的赌博游戏中，赔率是 1:1 ，而庄家不会出千，开大和开小的概率均等（皆为 50%）。赌徒一开始压一块钱，如果他压错了，那么下一次就压两块，再错继续加倍。一旦压对，赌徒永远可以保证有一块钱的进帐。并且从 1 块钱重新开始。</p>

<p>看起来，这种策略能保证永远包赚不赔。但实际上为什么没有人用这个方案发财呢？</p>

<p>放到现实中，试图采用这个策略去赌博的人，几乎都会赔的倾家荡产（当然只要是赌博，差不多都是这个结局）。不要怪运气，不要怪庄家出千，因为这个策略从一开始就注定了失败。</p>
]]>
        <![CDATA[<p>让我们把赌博游戏换成等价的扔硬币实验。请问，连续掷出 7 次正面的概率有多少？</p>

<p>稍有概率常识的人都可以心算出答案：1/128 ，也就是略小于 1% 。比 D&amp;D 跑团时投出 20 重击要难多了（拜一下骰子大神）。</p>

<p>那么，谁能凭直觉说出，掷 30 次硬币，至少出现一次“连续 7 次正面”的概率有多少？我写了个小程序计算了一下，答案远大于大多数人的直觉，居然达到了 18.3% 这么高。</p>

<p>好了，现在把掷出正面换成压对大小。也就是说，你参加 30 次赌局，出现连续 7 次压对，或连续 7 次压错的概率并不那么的小。而且这个概率还会随着赌局次数增加，逐渐趋近于 1 。</p>

<p>这意味着什么？</p>

<p>如果你只有 128 块的赌本，在 30 次赌局中，输光的可能性居然有 18.3% 这么高。诚然，你可以运气很好，在一开始赢到一些额外的资金。但促进最初的策略所需要的进一步资金是 256 块，在 30 次赌局中是绝对不可能办到的。</p>

<p>赌徒可以增加自己的赌本，让自己可以承受更多的连续失败。但赌本的增加将是指数级上升的，但对提高不至于输光的概率却很有限（线形增加）。只要他在赌场上玩上一通宵，多少钱都能输干净。</p>

<p>赌博最终就是看谁的本钱多，而不是谁的运气更好（骰子大神啊，请不要跟我绝交。谈谈数学而已，莫要当真）。如果你赌本比不过庄家，乘早收手吧。btw, 这话是写给众多转战 A 股的朋友们的。</p>

<hr />

<p>我想任何一个具有理性思维的人都不会对赌博有太多兴趣。想必我的 blog 的读者中这样的人居多，其实我今天主要是想谈游戏的 :) 。</p>

<p>我们前段开始内测了一个<a href="http://xyc.163.com">卡牌游戏</a> （注：需要内测帐号的朋友请自己去<a href="http://xyc.netease.com">官方论坛</a> 申请，不要找我 :) ）</p>

<p>在测试时，同事在50 张的卡组里放了 25 张生物卡。并认为，在游戏中每次摸新的卡，是生物卡的概率是 50% 。可是在实际游戏中，几乎每局都会发生连续 5 次都摸不到生物卡的情况。</p>

<p>一开始，我们认为系统的伪随机函数生成的<a href="http://blog.codingnow.com/2007/11/random.html">伪随机数列</a>不够随机。后来换了一个随机数函数，情况并没有得到改善。</p>

<p>今天我计算了一下，如果是掷硬币实验，连续 21 次中，至少出现 5 次连续正面的概率居然达到了 49.9% 。当次数增加到 30 次后，概率有 71.4% 之高。而我们的卡牌游戏，几乎每局都会有 20 多次摸牌机会，出现连续 5 次摸不到生物卡的概率其实够大了。经常出现这种情况，还真是怪不了伪随机数列的生成算法，或是洗牌函数。</p>

<p>写到这里，还有人不信邪。我掏出了我的 <a href="http://blog.codingnow.com/2007/09/handwork.html">20 面骰</a> 。在桌上做起实验。</p>

<p>我们规定，投出 1-10 算小，11-20 算大。一直投下去，直到出现 5 次连续的大、而后游戏结束。最后统计一共投了多少次。在没有进行游戏之前，有人估计可能每玩一局可能会投接近 100 次；可实际结果另他失望（更接近计算结果）。</p>

<p>我们一共做了三组实验，分别在 22 次，24 次，31 次结束了。</p>

<p>如果有朋友想试试，可以用硬币或麻将用的六面骰实验。</p>

<hr />

<p>所以说，当你在打网络游戏时，如果某天发现某件装备的凋落率，或是合成率远低于官方公布的数字。请不要抱怨自己命不好，也不要怀疑系统作弊。若让程序员们产生一个特定分布的作弊随机数列，又不那么容易被人看出规律（不够随机）出来，难度和成本（CPU 成本）比采用系统的随机数发生器要大的多。比如使用 <a href="http://mint.sbg.ac.at/desc_SNiederreiter.html">Niederreiter Sequence</a> 。</p>

<p>最后附一张图片，我随手用一个 C 程序生成的。程序在图片的下方：</p>

<p><img alt="random.png" src="http://blog.codingnow.com/images/random.png" width="256" height="256" /> </p>

<pre class="mtc_block"><span class="c_Preproc def_Directive">#<span class="c_PreprocInclude def_Path def_URI">include <span class="c_IncludeOutline def_Outlined def_Special"><span class="c_PreprocIncludeEdge def_StringEdge def_String"><span class="def_PairStart def_Special">&lt;</span></span>stdio.h<span class="c_PreprocIncludeEdge def_StringEdge def