由于没实际做过游戏,也没有阅读过商业游戏的网络模块的代码。所以下面的思考全部都是凭空而出,仅仅是一个需要解决这个问题的程序员的架空设想而已。如果因为本文产生的任何程序bug,本人绝对不负任何责任?
开始的情况是这样的,我自己开发的小游戏(一个比较类似于RTS的游戏)中想支持网络对战,一开始只是想支持简单的对战而已(我开发这个小游戏的目的主要是想实践一下3D引擎,游戏性是次要的),所以很自然的就想到了使用Command模式,把用户的输入转化为标准的Command,然后由Command管理器排序,优化后丢给引擎,改变世界的状态,并显示到显示器上。支持对战也简单了,Command管理器在把命令发给引擎的时候,同时发给网络模块使网络模块可以传递给其他的用户,并且网络模块也可以接受其它的用户发来的Command并交给Command管理器。简单明了的方法,我真是天才 哈哈哈!!!
后来再仔细想想,这个模式对我这个简单的游戏可能没问题,但是要求稍稍多一些,情况复杂一些就不够用了。首先,命令在网络中的传递是成几何增长的,因为每个用户都要把自己发出的命令传递给其它所有的,整个网络中传递的信息存在着大量的冗余。而且,引擎的任务加重了,这种模式可以导致大部分用户的引擎处理的Command对列是基本一致的,这就造成了大量的计算冗余。并且引擎必须保证他们对这些Command的处理结果都是完全一致的。(意味着许多带有随机特性的处理将需要等待同步,大家必须对同一次随机数的产生得到相同的结果。)
再想想,又发现了一个缺点,某些不法的用户还可以很容易的修改自己的引擎代码达到作弊的目的。因为其它用户只是被动的接受Command,基本上无法判断Command的合法性。看来这种完全对等的网络结构是很难行的通了,我需要新的网络结构。
图 成几何增长的通信管道
“看来 C/S 模式是无法避免了。”,每个用户都把自己的Command 丢给服务器,由服务器来进行计算,改变世界。然后用户们再从服务器上即时的更新新的世界状态丢给引擎,引擎绘制并显示到显示器上。
图 使用传统的 C/S 模型
(待续)