zoukankan      html  css  js  c++  java
  • 关于P2P架构的网络游戏

    以下内容摘自《ActionScript大型网页游戏开发》

    —————————————————————————————————————————————————————————

    P2P架构

    P2P架构是两个或多个客户端不经过服务器而直接通信的架构。可能首先会使用服务器以让客户端间能查找到对方,但在此之后就不再需要服务器了。具体也分两种不同的形式:一种是完整连接拓扑架构,指的是每个客户端与其他客户端之间都必须有连接,信息可以直接在用户间交换;另一种是环状拓扑架构,指的是信息只有流经一个或多个客户端后才能传递过来的架构。本文当谈到P2P架构时,指的是完整连接拓扑架构。

    一般来说,P2P架构在游戏方面用的不多。很多情况下游戏似乎是在使用P2P架构,但实际上其中的一个玩家已被设定为主机来充当服务器的角色。然而,P2P架构非常适用于搭建文件共享网络。通过它,网络游戏经常能够高效地为玩家们发放游戏补丁(比如《魔兽世界》),这不仅减轻了Web服务器的负担,而且也加速了玩家下载补丁的速度。

    与C/S架构相比,P2P架构技术有几个明显的优势,当然也存在几个缺点。先讲讲它的优点。

    P2P架构的优点

             延时较小。延时就是指信息在从发出到接收这个过程中所用的传输时间。在C/S模式中,信息是先从一个客户端传到服务器端,而后再从服务器端传到另一个客户端。但P2P架构则是让信息直接在两个客户端间传递,这样就比C/S模式减少了一半的传递时间。

             不需要服务器端。既然P2P架构全是由客户端建成的,因此也就没必要使用服务器端。这对于无论是游戏开发者还是发布者来说都是一件好事,因为他们不用再为维持运行游戏中央服务器而支付主机托管和管理费了。

    P2P架构的缺点

             游戏的可扩展性差。当游戏的客户端相当少的时候,那就用P2P吧,因为它产生的延时很小且不需要使用服务器端。但是当游戏有很多客户端时,比如说成百或上千个客户端,那么P2P架构就不适用了。因为它需要每个客户端都和其他客户端保持一个独立的连接。那么如果有1000个客户端的话,完整拓扑架构就要求每一个客户端都要建立并维持1000个开放的连接,其中每一个客户端都要接受来自其他客户端发出的所有信息。而在C/S架构中,一个客户端只从服务器端接受经其职能筛选和归集后的信息。

             另外,还要考虑一下此种网络的应用环境。假设你有1000个客户端,但是它们全都在学校的子网络中,1000个用户彼此相连导致产生了1000000个连接,这将会使网络因不堪重负而瘫痪。但是如果同样数目的连接放到全球互联网上,则根本不会出任何问题。

             争议解决机制不健全。加入有个双人P2P游戏,每一方都能操纵鼠标去吃奶酪。玩家A接近第一块奶酪,然后确定离它足够近时就可以吃了它,于是玩家A因为吃了奶酪而获得了一定的积分,然后他传递信息给玩家B,告诉B:这块奶酪已经被我吃了。玩家B接收并处理了这条信息后从自己的屏幕上删除了那块奶酪,并且更新了玩家A的得分。谁都没有异议,两个客户端对当前游戏的状态达成了一致。

             但比如说现在玩家A和玩家B都在对下一块奶酪跃跃欲试。不巧的是这一次他们相互之间逻辑决策的时间就差了几毫秒,双方都各自认定是自己吃了这块奶酪,然后都给自己加上了分,然后互发信息给对方证明是自己把奶酪吃了。结果两个玩家就会互不相让。

             所以,P2P架构的一个缺点就是:没有中心逻辑决策者。还有一些范例更能说明问题。

    ü  两个战斗到最后的玩家间互发了一个必杀技,谁先倒下?

    ü  在赛车游戏中,谁第一个冲过终点?

    ü  玩家争着抢地上的钥匙,哪一位先抢到呢?

    处理此类问题最好的方法就是采用C/S架构,让服务器来维护游戏运行中的状态,充当逻辑决策争议的逻辑决策者。

    P2P架构可通过选派一个客户端充当主机(但其本身还是P2P架构中的一个客户端)来解决逻辑争端,而这样做会带来下面两个新麻烦。

    (1)如果所有重要的逻辑冲突都要通过充当主机的客户端来解决的话,那就丧失了对等网络架构的延时较低这个优点,因为信息要从客户端传到主机由其处理完后再传回客户端。

    (2)P2P架构游戏本身存在安全隐患,因为所有的重要逻辑行为都运行在客户端而没有在一个中央结点得到验证。那么如果你把所有重要的逻辑决策权都交给主机的话,无疑会使这个特殊的客户端在理论上具有了某种控制能力上的优势(作弊的机会大大增加)。

  • 相关阅读:
    Matlab 绘图实例
    最大回撤,最大回撤恢复时间与最大回撤持续期
    scikit-learn 中 OneHotEncoder 解析
    TensorFlow 内置重要函数解析
    关于字符串常用的函数
    SQL 值得记住的点
    Ubuntu E: 无法获得锁 /var/lib/dpkg/lock
    Ubuntu 16.04 同时使用python3.5
    numpy
    Jupyter notebook 使用Turorial
  • 原文地址:https://www.cnblogs.com/cuizhf/p/3238629.html
Copyright © 2011-2022 走看看