伪随机算法同步

  一般来说网游要求逻辑在服务端计算,原因是一方面利于玩家之间逻辑同步的实现,另一方面服务器做仲裁方,防止玩家作弊。但在有些情况下,由于一些逻辑要求的实时性很高,我们不得不把一些逻辑的判断放在客户端,以保证游戏的流畅感。比如动作游戏中,玩家受击时的动作切换,如果需要根据属性逻辑计算的结果切换到不同被动动作,不同的被动动作意味着玩家是否能更快的反击对方。

  在这种情况下,如果服务器无法直接参与这部分的逻辑计算,那么服务器可以验证客户端传来的结果是否与服务器计算的一致,从而判定客户端是否有作弊的嫌疑。由于客户端不需要等待验证结果,所以游戏的流畅感被保证了。同时,服务器能够判定玩家是否作弊,以此为证据向运营人员反映,从而以运营手段保证游戏的公平性。

  在逻辑计算中,我们一般会使用大量的随机算法。服务器需要对客户端的随机结果进行验证,做验证的一种方法就是保证服务器计算的随机值与客户端相同。由于我们使用的随机算法大多数是伪随机,也就是说在随机种子不变的情况下,每一次启动后,调用随机函数取出的随机值是可重复的。因此服务器与客户端之间的随机值同步是可以做到的,前提是两者的随机数种子相同,随机算法相同。完成伪随机算法同步需要考虑以下几步:

  第一步是随机种子,我们可以在战斗开始,或者玩家登录后,在服务器生成一个随机种子,并发送到客户端。以后在客户端与服务器上,该玩家的随机算法就使用这一个相同的种子计算。

  第二步就是两边实现相同的伪随机算法。伪随机算法一般来说就是一个数学上的曲线函数,种子是输入变量,然后由函数计算出结果,就是随机值。这个随机值结果会以作为另一个函数的输入,计算出下一个随机函数使用的种子变量。

  第三步我们必须保证客户端与服务器计算随机值的序列一致。也就是说客户端第n次使用随机函数计算的值,传给服务器,服务器也必须用第n次使用随机函数计算的值来验证。一般来说由于tcp的有序性,只要客户端按顺序计算,按顺序发包,服务器按收包顺序依次验证,就可以保证序列一致了。但在服务器端情况可能会更加复杂一些。比如说服务器收包后,可能将包分发到不同的服务上来验证,由于不同服务执行的顺序无法保证,那么就会有一些问题。解决这个问题的办法有两种,第一是随机值在收包服务中进行,然后把计算出的随机值发给验证服务。第二是有一种专门的服务计算随机值,然后将随机值结果按顺序保存在数据结构中,其它服务通过序列ID从这个服务上面去取随机值结果。

posted @ 2013-12-12 16:35  PbLite  阅读(3094)  评论(0编辑  收藏  举报