互联网游戏当然离不开通信技术的支持,对于Silverlight,哪一种通信技术最适合开发MMORPG游戏呢?本文通过比较Silverlight支持的几种主要的通信技术的特性和适用环境,选择一款最适合我们的。
1 Socket
提到开发游戏,性能和速度当然是第一位的,Socket应该是首选的通信技术。因为所有的Silverlight通信技术都是基于TCP/IP的,Socket可以直接控制TCP/IP的连接和数据传输,对于网络游戏开发者来说,可以提供最大的灵活度和可控性,不过编程也是最复杂的。
对于专业的Silverlight网络游戏来说,毫无疑问Socket是首选了。然而对于业余游戏开发者来说,Socket的缺点也是致命的。首先,如果使用Socket,必须在服务器端运行TCP Server程序,只有租用独立主机的环境才可能部署,对于大多数共享的web空间是不允许的。而租用独立主机的价格是共享的web空间的几十倍,不是普通人可以承受的。对于广大的业余游戏开发爱好者,例如笔者,使用Socket的成本太高,不得不放弃。有的朋友可能会说,我们可以在自己的机器上部署,然后通过宽带共享出来。虽然这也是一个选择,但是家庭用宽带的质量实在不能恭维,无论是反应速度,传输速度还是可靠性都比专业的web租用环境差许多。笔者以前曾经用自家的2M的cable宽带(比ADSL质量好)做过试验,从外面连接家里的web服务器,打开一个简单的网页都很慢,支持游戏就更不用想了。
其次,Silverlight可以使用的TCP端口为4502–4534,很可能被终端用户的防火墙所屏蔽,导致游戏无法连接。尽管用户可以关闭防火墙或者打开这些TCP端口,不过这无形中增加了用户使用该游戏的复杂度,违背了web游戏‘打开浏览器就能玩’的原则。
结论是Socket可以提供最好的性能,但是只适合于专业Silverlight游戏开发。对于业余Silverlight游戏开发fans,只能从众多的基于web的服务中选择一个了。
2 Web Service
基于SOAP协议的Web Service应该是大家再熟悉不过的了,古朴,简单,通用,跨平台,优点一大堆。如果没有特殊需要,Web Service是很不错的选择。不过缺点也显而易见,SOAP协议封装带来不少传输开销,效率不高,用来开发游戏不太适合。
3 REST
REST Web服务主要用来从服务器读取大量文本信息,例如XML文档。简单但是不太易用,因为无法通过Visual Studio来自动添加服务,生成代理代码。尽管REST与Web Service相比减少了SOAP协议封装开销,但未经过压缩的数据量依然不小。同时编程的不便也是放弃该技术的原因之一。
4 WCF
自从.Net 3.0开始,就有了WCF。WCF是微软主打的解决网络通信问题的万能钥匙,也就是说,如果你使用Window平台,微软希望你首选WCF。WCF很强大,也很灵活,通过不同的Binding方式,可以满足不同的需要,这里仅讨论Silverlight支持的几种Binding方式。
首先是
BasicHttpBinding,Silverlight 2唯一支持的方式,基本上与普通的Web Service完全相同。也就是说,从客户端的角度看不出什么差别。当然Web Service的优缺点也就一并继承过来。结论也一样,不适合游戏开发。
从Silverlight 3开始支持WCF
CustomBinding,缺省支持Binary Encoding。数据不再用明文传输,而是压缩后用二进制方式传输,据统计可以减少30-50%的传输量。与前面提到的技术相比较,WCF Binary Encoding是不错的选择。
WCF Duplex services支持服务器与客户端的双向通信,即不仅是客户端发起服务请求,服务器也可以主动发送消息。对于某些类服务,例如证券交易信息,外汇牌价信息,天气预报等服务,是很适合的。然而WCF Duplex services在服务器端的开销是很大的,因为其实现机制是对于每个客户服务,每次通信完毕后并不关闭连接,所以服务器可以通过该连接主动发送下一个消息。显而易见,如果很多用户连接该服务,服务器承受的压力是很大的。因此WCF Duplex services比较适合在Intranet环境,最大连结数控制在几十个。对于Silverlight游戏开发就不太适合了。
从Silverlight 4开始支持WCF net.tcp binding。其性能堪比Socket,同时享有WCF编程的便利,真是好东东啊。不过很遗憾,与Socket一样,我们业余fans无法享用该技术。首先,需要IIS设置上使能net.tcp协议。笔者的web hosting服务商回答:在shared web host上不支持该协议,如果需要该协议,建议租用独立主机。lots of $$$...其次WCF net.tcp binding与Socket一样有TCP端口的限制。可想而知,结论和Socket也一样,不是业余fans的选择。
5 WCF RIA Services
最后让我们来看一下Silverlight的新宠,Silverlight 4的明星:WCF RIA Services。尽管它是基于WCF的,但是我们根本不用意识到这一点。通过Visual Studio给我们提供的巨大便利,我们几乎可以通过傻瓜的方式来从客户端(Silverlight) 来直接操作服务器端的数据库,所有的中间过程(类的生成,建立连接等)都由Visual Studio代劳了。对于Silverlight商用软件来说,WCF RIA Services简直方便极了,就像linq一样,一旦用起来,就再也舍不得放下。还有一个原因,WCF RIA Services是为Silverlight量身定做的产品,实为Silverlight通信技术的首选啊。不过等等,对于Silverlight游戏开发,WCF RIA Services同样那么美好吗?经过反复思量,笔者得出相反结论。原因如下:
首先,WCF RIA Services略嫌臃肿,有点牛刀的感觉。对于斤斤计较的Siverlight游戏,几百KB额外的传输量有点不太划算。
其次,WCF RIA Services适合于大量的数据库select/insert/update/delete操作,对于游戏简单逻辑来说有点大材小用。
最后,尽管没有找到佐证,由于WCF RIA Services相当于在WCF上包装了一层,性能上相信比WCF要损失一些。
综上所述,对于业余Silverlight游戏开发者来说,笔者认为最合适的技术是WCF Binary Encoding。同时使用起来也是最简单的,因为缺省的Silverlight-Enabled WCF Service就是Binary Encoding。当然这只是笔者的看法,如果大家有什么不同见解,欢迎一起讨论。