close

4:56 PM
网络游戏服务器动态负载平衡方案
很多网络游戏希望把所有玩家放在一起,也就是在一个游戏世界中进行游戏。目前的网络游戏虽然玩家可以在不同的场地中行走,并因此在不同的服务器间移动,但支持一块场地运行所用的服务器却不能从一台服务器更换到另一台。一台服务器的能力有限,因此同一块场地上的玩家人数也不能太多。另外场地上的玩家会有时多有时少。玩家多的时候会发生其他玩家不能进入这块场地等问题,玩家少的时候服务器资源又被浪费了。因此本方案提出了一种动态分配支持一块场地运行所用服务器的方法。它可以支持所有的玩家在同一块场地中进行游戏。

    我们知道有很多游戏可以保存游戏进度。保存某一时刻游戏的状态。在以后装入这个状态。即使是在保存这个状态不同的计算机上,也可以使游戏完全恢复到保存时的状态,从而从那个状态继续游戏。如果我们把某一台服务器C1上的某一块场地SC1的状态传送给另一台服务器C2,就可以把支持SC1运行所用的服务器从C1移到C2。然后SC1中的所有客户端CL1需要把他们游戏所用的服务器从C1改换到C2。那么如何把网络游戏客户端所用的服务器从一台移到另一台呢?C1在时间T1保存SC1的状态S1,并把S1传送给C2。C1给CL1发送消息D3,要求CL1和C2连接,并改为向C2传输D1以及从C2接收D2。由于网络游戏服务器端和客户端是异步运行的,所以在T1时间之后,CL1接收到D3之前,CL1仍然会向C1发送游戏数据D4。C1需要把D4转发给C2。C2要先接收并处理完D4后才能继续处理CL1直接发送给它的游戏数据。

    现在我们已经能把支持一个场地运行所用的服务器整个地从一台服务器换到另一台了。如果更进一步,我们把场地SC2中的一部分状态,例如一部分玩家和非玩家角色R1的状态S3从一台服务器C3搬到另一台服务器C4,由C4来支持R1的运行以及计算和确定R1的状态。未搬到C4的那些状态S5仍然由C3计算和确定。这样我们就把能支持SC2运行所需的负载分摊到两台服务器。在C3需要获取S3的状态时,需要请求C4把S3的状态传送给它。在C3希望修改S3的状态时,也需要请求C4来执行。注意,应该把C3修改S3的状态看成是请求而非强制或确定地执行。因为有很多因素导致这种请求不成功。例如C3上的一个玩家P1向C4上的一个玩家P2射击。但是C3所知道的P2的状态实际上是滞后于C4的。因为C4在P2的状态S4改变的时候需要把S4传送给C3。但是通过网络传送数据必然会有延迟,也就导致C3所知道的P2的状态必然滞后于C4。假如P1发出射击P2的请求后,C4先收到另一个玩家P3射击P2的请求,并且判定P3杀死了P2,那么C4就应该把杀死P2所获得的分数加给P3。在C4收到P1射击P2的请求后,只能判定P1射击了P2的尸体而不得分。因此,在C3接收到P1射击P2的请求后,并不应该修改它所知道的P2的状态,而应该等待C4给它状态改变的通知。并且只有在C4告诉C3 P1杀死了P2后才给P1加上一分。

    在场地上的玩家人数增加时,我们还可以把S3和S5进行更多的拆分。通过这种方法,我们就可以让一块场地支持无限多的玩家同时游戏。

    随着场地被不断地分割,如果相邻的两块某一时刻都只有很少的玩家,也可以把这两块交给同一个服务器来支持他们的运行,并把这两块合并为一个大块。用这种方法,我们就可以动态地在服务器间分配支持玩家运行所需的负荷了。

    我们还可以在一个网络游戏刚开始运营时只使用少量的服务器。随着游戏中的玩家越来越多,在不停止游戏运行的情况下,动态地增加服务器。因此本发明具有很强的可扩展性。

    本方案已申请专利,寻求投资及合作。
Views: 721 | Added by: ystyle | Rating: 0.0/0
Total comments: 0
Only registered users can add comments.
[ Sign Up | Log In ]