gpt4 book ai didi

c++ - 是否可以在Actionscript 3.0中进行实时网络游戏

转载 作者:行者123 更新时间:2023-12-02 20:56:26 26 4
gpt4 key购买 nike

问题:是否可以通过套接字连接在Flash Player中更新100个以上的对象?更多细节和我自己的尝试在下面!

详细信息

在实习期间,我有时间创建一个多人物理游戏。我在上面稳定工作了三个月。我的实习即将结束,我无法完成比赛。

我的问题是,每个时间都很难将多个数据包发送到服务器并返回。我发送的数据包是其他客户端的对象和鼠标的位置更新。

我将尝试解释网络/游戏流程。

  • 客户端使用AS3中的二进制Socket类连接到服务器
  • 服务器请求验证,客户端发送名称和缩略图。
  • 服务器等待,直到连接了4个客户端(某些配对)。
  • 服务器选择4个客户端,并使它们在单独的线程(作为一个团队组合)上运行
  • 客户端将其性能得分发送到服务器范围1-100。
  • 服务器使最佳客户端成为物理主机,其他3个从属服务器
  • 主机游戏设置关卡,并在关卡中制作大约1-100个形状(主要形状和复杂形状,例如桥梁,马达, Spring )
  • 主机在每个时间步上都会获取形状的所有更新属性,并将其发送给客户端(x,y,旋转, sleep )
  • 客户端将所有shape属性应用于正确的形状

  • 我尝试了不同的时间步长,并注意到直到1/15秒的时间步长,客户端(从属)都不会注意到游戏中的任何滞后。我还尝试选择一个较低的时间步长来调整形状的运动,但这确实在客户端(从属)方面产生了一些奇怪的运动。

    我将给出一个单个对象更新数据包的示例。
    <O|t=s:u|x=201|y=202|f=automaticoo</O
    <O|t=m:p|x=100|y=345|f=automaticoo</O

    我注意到Flash Player在发送之前可以在缓冲区中堆叠很多数据包。例如,如果我一次发送很多数据包,则将它们堆叠起来并一起发送到服务器。使用更快的时间步,您不会在客户端(从属端)获得更多更新,而在同一数据包行中获得更多更新。

    尝试
  • 使用新的RTMFP(udp&p2p)协议(protocol)进行更新。 (性能稍好一些,但可靠性却稍差一些)
  • 用c++而不是Air(使用ServerSocket)用c++编写我的整个套接字服务器(性能更好,但注意到滞后的部分不是服务器,而是Flash Player)
  • 使用ByteArray压缩方法和AMF序列化格式(除c++服务器无法反序列化消息外,性能基本相同)

  • 你们是否认为Flash Player在每个时间步中也可能处理如此多的更新请求。

    发现

    在ActionScript 3.0中,有一个多人游戏的斗兽场游戏。他们使用了很多技巧,即使这样,我也得到了大约300ms的ping,并且它只会不断更新玩家(一个大厅中有4位玩家)。

    抱歉,很长的帖子。

    最佳答案

    我相信您的问题归结于游戏和数据的类型。

    这又分解为:

  • 服务器速度(计算世界/玩家数据所需的CPU + RAM需求)
  • 连接速度(服务器上的带宽)
  • 数据大小(需要多少信息以及多久一次)
  • 玩家互动形式(事件或FPS)
  • 从客户端到服务器的距离(ping)


  • MMORG

    例如。据我所知,《魔兽世界》在客户端服务器上使用“客户端是视口(viewport)”和“客户端发送击键”,“服务器验证并执行并告诉客户端发生了什么”,在无PVP的世界中。

    这给游戏带来了很多可以接受的延迟,因为您只需要从客户端传输命令,然后再将结果传输到客户端即可。其余部分在客户端上绘制。

    它是由事件驱动的,从您单击一个图标或按一个键即可,您的“咒语”需要一些时间才能在服务器上触发。其次,不需要玩家碰撞。这也使服务器可以处理更少的数据,并使对服务器CPU的要求更小。

    反恐精英/战地等

    FPS,快速的行动,快速的响应需要始终获取有关每个细节的信息。这对精度提出了更高的要求。碰撞对于玩家和武器都是必须的。

    这种游戏通常无法在一张 map 上处理超过32位玩家,因为他们都需要能够非常快速地分享自己的位置,子弹,爆炸等。所有这些数据都必须通过服务器验证,这又是任何类型的在线游戏的瓶颈。

    网络延迟

    在理想情况下,这将是0毫秒,但众所周知。从客户端到服务器再到服务器的所有硬件都需要时间。无论是通过网络堆栈还是通过Internet连接(交换机,路由器,调制解调器,光纤中心等),都可以通过“预测”来解决许多现代实时游戏的问题。让服务器查看您的方向和速度。然后他们尝试预测(就像GPS在隧道中一样)最后一次看到您以+4的速度向前移动,因此在给定的时间范围内您已经移动了(时间范围x 4)-但是如果您放慢了速度或加快了速度,该怎么办向上?然后他们要么立即将您从A瞬间“超跳”到B,这感觉就像是一个落后的游戏,或者它们轻松地升到了真实位置,因此您的“英雄”会更快或更慢地滑入正确的位置。

    这项技术在网上的很多地方都有介绍,因此这里不需要详细说明,但是要获得良好的性能需要花费一些时间和调整-但它有效并且为程序员省去了很多麻烦。

    需要什么网络数据?

    我读了您的问题和想法:这可以压缩很多。其次,我使用纯ByteStream进行了Flash套接字聊天,并且效果很棒。很难一开始就运行,但是一旦我启动并运行它就很快了。

    Flash客户端/播放器本身不是最大的网络客户端,因此也希望那里失去很多速度。对于网络部分,我的速度为10-15 fps,然后对传输的数据使用更原始的方法。

    最后,请尝试使数据尽可能简单。

    例如。对某些数据/事件使用COMMANDS/SHORTCUTS。
    像服务器数据字节串可能是:0x99、0x45、0x75、0x14、0x04、0x06

    其中0x99表示:在以下坐标处发生大爆炸:(0x45,0x75)
    然后0x14表示:玩家0x14(十进制的玩家20)已移至(0x04,0x06)

    因此,凝视着的操作码告诉客户端和服务器中的网络协议(protocol)处理程序接下来会发生什么。 (这是CPU知道如何读取内存的方式。)

    对于我的聊天,我有解析每种数据类型的命令。一个用于登录,一个用于广播,用于告知用户名称等。因此,一旦客户端登录,客户端就会收到一个命令+一堆在线用户。这仅被转移到客户端一次。之后,每个连接的客户端也会收到带有新用户名的“在线新用户”命令。每个客户端都使用当前用户和ID维护自己的列表,因此我只需要告诉哪个客户端编号即可显示文字。这使流量最小化。坐标或做什么命令也一样。 “播放器#20向北”等可能是0x14、0x41、0xf0(0x41可能是MOVE,0xf0可能是NORTH,0xf1 EAST等)

    距游戏的物理距离

    您不能更改此游戏,但可以设置一些限制或使服务器在全局的多个位置运行,具体取决于您要制作哪种游戏。 Amazon EC2是此类项目的绝佳平台,因为它们在全局范围内都有数据中心,然后您可以针对这些项目对用户网络进行基准测试,然后将用户重定向到最近运行服务器的数据中心。

    骇客/作弊

    还要记住,如果某件事变得流行并且您开始从中赚钱,则SOMEONE迟早会尝试破坏协议(protocol)或破坏帐户以访问服务器,信息或作弊以获得游戏中的其他物品/积分。您也可能会受到DDOS的攻击,在DDOS中,DDOS会用错误的数据轰炸您的网络,从而使所有内容崩溃并使游戏无法使用。

    刚开始就不必太在意它,只记得记住,一旦您上网,就永远不知道他们是谁,或者是世界上什么地方。我不是想让你变得偏执,但是有些病人会试图通过欺骗别人来赚钱。

    因此,请考虑到您的结构中,不要在不需要的网络程序包中显示数据。不要相信来自客户的数据总是正确的。在服务器端验证数据。

    如果您同时有100位活跃玩家,这也将花费一些时间。

    但是,一旦这样做,如果对您来说是一次巨大的成功,您就可以睡得更好,这是我真正希望的。

    那是我从经验中得到的想法。希望其中一些可能有用,即使我没有完全回答100个玩家是否可能。

    实际上,我会说:是的,可能有100个玩家,但是这取决于他们是否同时移动并且是否进行了碰撞测试,以及您是否接受延迟。

    关于c++ - 是否可以在Actionscript 3.0中进行实时网络游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798980/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com