手机网络游戏“武林擂“技术分析


所属类别:技术博客

文章作者:GameDO

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


十一后将要做手机网络游戏,可我从来都不玩网络游戏,更何况是手机网络游戏,所以周五下班后准备下一款手机网络游戏来见识见识。听说神役不错,于是就到捉鱼和掌控的的WAP网站上下,但是下了N次都是失败,我的手机可是3230的标准机型!没办法只好去下青龙珏,老是下到一半就断掉了。唉,移动的破网这想下都下不下来,用户体验太差了。于是破罐破摔能下谁下谁吧,搞了两三个小时都没搞定,最后偶然把武林擂下了两次竟然下下来了,精神陡然为之一振,倒霉的武林擂就拿你开刀吧! 先玩了一遍,有很多地方可圈可点的,细节也很注意,看的出来掌上明珠是花了一定的心思的。等上手了之后我又拿L7下了一个,两个机型放在一起比较网络延迟,发现了许多有趣的设计,比如消息优先级,你会发现玩家移动的距离越远则被广播的可能性越大,这些使我对这款游戏产生了很大的兴趣,于是决定反编译他的字节码看个究竟。 花了两天周末的时间,搞的天旋地转的,总算搞定了他的框架和网络协议,做了个注册机在模拟器上自动注册了从cocomo2到cocomo10的账号。网络协议的加密工作做的真的是太差劲了,几乎没有什么加密,CRC效验码也做的不伦不类,仅对每个待发送的字节做异或处理,一开始还奇怪这是什么呢,后来才想起来估计是CRC效验码的变态版^_^。这样的协议设计幸亏我心地善良,否则服务器早就爆掉了。下例是一个消息的封包,封包消息17代表注册用户消息: k k1 = new k((byte)17); k1.aWriteString("cocomo11"); k1.aWriteString("19842196"); k1.a((short)0); k1.a(1517); k1.aWriteString("NK-6600"); k1.aWriteString(str); k1.aWriteString(""); k1.flush(); 他的客户端是一个瘦客户机的设计,在jar包中绝对见不到大量的图片和资源文件,都在服务器端存放,即时下载,这样可以把jar做的很小,便于下载,这样的客户端变得更像一个脚本引擎了。 他的架构很奇怪,一开始一直搞不明白,类之间跳来跳去的,N个线程不停的开,不停的关。搞了一天一夜才弄明白:一开始他用HttpConnection连接服务器http://211.100.18.94:7000/wulinipd/serverlist3?type=tcp,获得一个服务器列表: MSISDN= 华山之巅(良好)=socket://218.206.86.118:7777 昆仑论剑(满)=socket://211.136.83.106:7777 武林至尊(满)=socket://218.206.86.118:7777 登陆官网 http://3g.sina.com.cn/p/wll.php 然后选择服务器就用socket来连接咧,这招太狠了。 像神役和屠魔因为都是用httpConnection做连接,所以底层网络层是一个线程不停的在循环做数据接收和数据发送,网络层上层是数据层用来封包和解包,数据层上层是应用层,也就是从Canvas派生出来的那个类。 但是由于武林擂是用socket连接,所以网络层b类有两个内部类线程d和e,d用来做数据读取,e用来做数据发送,就像两个轮子一样,达到双工的效果。b类上层数据层是k类,用来组装消息。k类上层是c类,a类和m类联合组成了应用层。m类是从Canvas继承来的主线程,他会触发c类线程,c类线程不循环,他在需要接受和发送数据时会触发b类线程,b类线程会触发自己的内部类d线程和e线程,自己却join掉。所以发送和接收数据的线程并不是一直循环的,而是在需要的时候被触发,但是网络游戏这样频繁的发送数据,就会频繁的start线程,这样做有什么好处吗? 武林擂这个游戏的架构设计的还是很有意思的,不过我一直认为有些地方线程可以精简,没有必要开启那么多线程,有资源浪费之嫌,也可能我还没有理解他的精妙之处,如果有兴趣的朋友可以跟我联系。发表于 @ 2006年09月29日 00:02:00评论(loading...AddFeedbackCountStack("1303628"))编辑新一篇:麻将胡牌算法的一种设计及其分析旧一篇:扑克牌游戏代码下载

相关信息

· ASP实现简单的网页保护

· Microsoft.NET框架和VisualStudio.NET中的SOAP

· ubuntu下使用rar

· 在VB程序中处理随机事件








....

46787 13118