九城无线互联网事业部培训中心的吕剑锋跟大家分享“Unity中的网络”。
吕剑锋表示:与外界通讯加大游戏开发乐趣,进行网络游戏构成,可能会在这个基础上增加很多概念,最基础需要有一个服务器端,主要负责一些游戏逻辑,以及数据交换,数据存储,还有一个客户端,负责一些渲染现实,响应玩家输入,触发服务器逻辑,展现效果,客户端网络端通过这种环节进行连接。
图:九城无线互联网事业部培训中心的吕剑锋
以下是他的演讲实录:
做来做去单机游戏本身客户端这块没有太大问题。所以,在网络方面最大一个问题面临到有关服务器问题在里面,这是个人的一个习惯性做法,包括习惯性分类。基于HttP,包括把一些成熟页游,和当前一些手机网游,转到手机上里做这方面游戏,这种服务器称做Web服务器方式,主要是基于Http协议,实现通讯数据传输,一些外部网游还是比较多的。并且确实一些有关手机网游利用Http协议组织整个网络信息传输。
还有比较传统服务器,主要基于TCP、UDP协议实现通讯与数据传输,比较多的就是网游方式,包括之前做过很多网游,利用这么一个服务器方式来做。有关Web服务器的一些特点,比较简单,因为里面已经基于Http协议,包括像JAVA,PHP都可以实现Http开发网页一样简单方式去开放Web服务器,原来图片重复一些像数据完全没有问题。因为这方面人员配置一般数量是不少的,而且这方面技术也比较容易掌握。所以,在人员成本比较低的情况下,开发周期也比较短。
换句话说,还有一个缺点,比较显而易见,实时性比较差,数据量限制也是比较大。Http内容比较多,还有一个技术限制较大。一般会出现这样的情况,发送一个请求有一个响应,这样技术虽然有了限制还是相对比较大。针对传统服务器这方面,优点自主性强,比如基于什么方式,什么时候发,什么时候传也是很随意,而且适用性强,好多游戏都是都使用这种方式,但是自身带有一定缺点。但是,如果相对于这部分技术,一些比较强悍开发者来说,这种复杂度,对于好多小型公司这种复杂度确实是比较困难,尤其像一些公司人数并不是很多,开发人数并不是很多,开发周期确实很长,而且面临着一个比较大的途径就是开发成本相对比较高,尤其是现在游戏不停更新换代是比较频繁,所以开发时长对于整个游戏销售是非常关键的问题。
关于Web服务器实现方式,也比较成熟,方式也比较多,比如Java,Service,php,net等等。在Unity3D中配合使用,可能主要借助这两个类,一个WWW,或者WWWForm都没有问题。
当然,不外乎去使用传统服务系去写这样东西,从底层进行操作书写服务器,这是一种方式。还有一种方式借助现有一些网络引擎,RekNet,Photon、Smart Fox Server,借助这种网络引擎方式也是一种比较好的方式。其实网络游戏开发中需要去借助开发解决问题是非常多的。从底层开发网络游戏成本比较高、风险比较大,解决方式利用成熟稳定代码积累或成熟的游戏引擎。包括在Unity3D内部有这样网络实现,包括在学生,也会用到这部分东西,应用3D内部Unity实现。
本身MasterServer整个功能完全网络化,确实有一定欠缺,可以在其基础上进行一定丰富,这个丰富空间还是比较大的,而且见到很多网游内部的网络应该就是用MasterServer去写的,功能还是比较强大的。
还有,网络引擎Photon,定位网络层所做的一些东西,提供网络引擎,支持多种客户端平台扩展,这是一个多平台,最先应该支持的应该是Unity本身,底层还是Server,包括数据封包,网络传输等等这里面就已经包括进去了,而且是功能比较强大的一个网络游戏。这是里面的一个构架,这是底层的一个开发框架,它的一个模式,有其核心,是C++书写,最底层还是可靠的TCP,UCP,其实从这个框架可以看到有关他的特点,相对比较快速,简单,而且灵活,快速主要是C++执行效率比较高一些,而且还有一些IOCP异步网络模型,可靠UDP,优化数据包,应用层面采用C#语言开发,上手快,门槛低,安全,开发效率低,部署简单XCopy即可,开发也比较简单,搞定服务器端2个类即可,提供完整的日志系统,方便调试查核,提供内置性能参数监视器,方便监测系统运行情况,支持卷影拷贝,支持热部署,配置灵活。
Photon有一个最大好处,所支持的平台比较多,在这方面用了很多功夫。而且在部署整个项目的时候,可供用的,这方面一些流量查询,以及这方面信息相对比较多,所以可控制性可能比较高。所以,在Unity3D中网络游戏开发对Photon来说有什么优势?首先开发语言是相同,很多开发者用的Javascript比较多一些,属于不太熟悉的话,确实可以稍微熟悉一下,也没有其他办法,而且C#语言掌握起来还是比较简单的。
还有一个问题插件,无论如何Unity里面要供第三方东西,可能会涉及到一个插件问题,外部网页放一个C++,或者C语言插件是不可以的,我把官方语言上摘抄里面,客户端实现,这部分部署是没有问题的,我在Web上如果有问题,存在C++ 五和C语言所以不用担心Web,之前包括很多开发者会问到一个问题。可以确认一下这样一个事情,实际上我们之前对学生教学上面,还是去做,这是一些网游,当然比较小型化一点,而且里面并没有什么用户登录,这是一些网址,这应该不涉及给Unity3D班去做,我还比较喜欢这个地方,基本没有太大关系,这也是做一个论坛式宣传,这是一些有关网络游戏。
其实,在生成的时候有很简单方式,在主机生成之后,也会在生成一个一模一样的东西,包括上面会有一个ID,但是在使用的时候,在这上面设置一个控制脚本,比如内容向前行走,按W键向前行走,向什么键向后倒退,这样别人动你也动就会产生非常多的问题。所以,不管是谁生成的,生成的东西相对控制脚本是有的,但是对于其他的东西,这部分应该是被去掉的。
还有在创建服务器,连接服务器,状态连接的时候,其实,本身在处理类似于数据传输这部分内容,还有很大部分内容在搞这方面东西,尽管在整个游戏时间并不是很长,如果这个出问题,对于游戏的使用者来说,游戏体验是非常低的。
还有一个尽量压缩传输数据,网游性能。还有一个位置,基本上不要爬山越岭,把数据本身进行压缩,还有数据量本身,还有发送频率。不用直接把数据放到位置,或者应用程序,而是通过一个差值,并不是一下子变过去,而是慢慢走下去。
提问:500人和1千人引擎有什么区别?没有用户上线情况下是怎么做的?
吕剑锋:严格所说,所谓没有用户上线,都是技术员心理负担都挺清楚,本身有一个网络环境限制,如果全国人都来做这部分是不可能,在我的游戏引擎里面不做这样控制,包括受网络条件,各方面因素,还是有一部分的,这部分限制还是有。这是一些商业模式上的东西。
提问:包发送之后,是全包更新,还是用户下载资源?
吕剑锋:因为面临做一些小游戏还相对好一些,但不是很清楚,APP Store是一个正版用户,不知官方是否允许让其下载这些包,现在采用一种方式,绝大多数还是主动下载。在下载整合游戏的时候,可能会去找Wi-Fi,基本不走流量,现在因为国内很多用户支持能力还没有达到3D整个下载过来,而且当这个包的内容,或许大小非常大的时候,就需要下载新的包,就会消耗一部分流量,类似于360这样的东西也耗费很大流量。