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

aut*_*coo 5 c++ sockets flash actionscript-3

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

细节

对于我的实习,我有时间创建一个多人物理游戏.我坚持了三个月.我的实习即将结束,我无法完成比赛.

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

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

  1. 客户端使用AS3中的二进制Socket类连接到服务器
  2. 服务器要求验证,客户端发送名称和缩略图.
  3. 服务器等待直到4个客户端连接(一些匹配等)
  4. 服务器选择4个客户端并使它们在单独的线程上运行(作为一个团队组合)
  5. 客户端将其性能分数发送到服务器范围1-100.
  6. 服务器使最好的客户端成为物理主机和其他3个从属服务器
  7. 主机游戏设置关卡并在关卡中制作大约1-100个形状(主要形状和复杂形状,如桥梁,马达,弹簧)
  8. 每个时间步骤主机获取形状的所有更新属性并将它们发送到客户端(x,y,旋转,睡眠)
  9. 客户端将所有形状属性应用于正确的形状

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

我将举一个单个对象更新包的例子.

<O|t=s:u|x=201|y=202|f=automaticoo</O
<O|t=m:p|x=100|y=345|f=automaticoo</O
Run Code Online (Sandbox Code Playgroud)

我注意到Flash Player可以在发送之前在缓冲区中堆叠大量数据包.例如,如果我一次发送大量数据包,它会将它们堆叠起来并将它们一起发送到服务器.通过更快的时间步长,您无法在客户端(从属)端获得更多更新,但在同一数据包行中获得更多更新.

尝试

  1. 使用新的RTMFP(udp和p2p)协议进行更新.(性能稍好但可靠性较差)
  2. 使用c ++而不是Air(使用ServerSocket)对我的整个套接字服务器进行编码(性能更好,但注意到滞后部分不是服务器而是Flash Player)
  3. 使用ByteArray压缩方法和AMF序列化格式(性能大致相同,但c ++服务器不能反序列化消息)

你们认为在Flash Player中有可能每次都处理这么多的更新请求.

发现

在ActionScript 3.0中有一个多人游戏棒竞技场游戏.他们使用了大量的欺骗手段,即使这样我也能获得大约300毫秒的ping,它只会不断更新玩家(大厅中有4名玩家).

对不起,很长的帖子.

Ber*_*nDK 7

我相信你的问题归结为游戏类型和数据.

这再次被分解为:

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

MMORG

例如."魔兽世界"是我对非PVP世界的了解,使用"客户端是视口"和"客户端发送击键","服务器验证并执行,并告诉客户端在CLIENT-SERVER基础上发生了什么".

这为游戏提供了大量可接受的延迟,因为您只需要从客户端传输命令,然后将结果传递给客户端.其余的是在客户端上绘制的.

它的事件驱动,你点击一个图标或按一个键,它可以说你的"拼写"需要一些时间在服务器上启动.其次,不需要玩家碰撞.这样,服务器也可以处理更少的数据,并且可以减少对服务器CPU的要求.


反恐精英/战场等

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

这类游戏通常犯规处理超过32名球员在一张地图,因为它们都需要能够分享他们的位置,子弹,爆炸等非常快,所有这些数据都必须经过服务器验证这又是任何类型的在线游戏的瓶颈.


网络延迟

在完美的世界中,这将是0毫秒,但我们都知道.从客户端到服务器的所有硬件都需要时间.两者都通过网络堆栈和互联网连接(交换机,路由器,调制解调器,光纤中心等),因此许多现代实时游戏修复这个问题的方式是"预测".让服务器看看你的方向和速度.然后他们试图预测(就像GPS在隧道里做的那样)你最后一次以+4的速度向前移动所以给定时间框架移动(时间框架x 4) - 但是如果你减速或加速怎么办?吗?然后,他们要么立即从A"hyperjump"你在瞬间第二个B,这你感觉像一个滞后的游戏或他们容易达到让你的"英雄"的真正位置滑动的小快或慢进右possition.

这个技术在网上很多地方都有解释,所以这里不需要细节,但需要时间和调整才能从中获得良好的性能 - 但它可以为程序员节省很多麻烦.


需要什么网络数据?

我读了你的问题和想法:这可能会被压缩很多.其次,我已经使用纯ByteStream进行了Flash套接字聊天,并且效果很棒.一开始很难跑,但是一旦我开始运行它就很快.

Flash客户端/播放器本身并不是最大的网络客户端,因此也期望在那里失去很多速度.我会为网络部分寻找10-15 fps,然后使用更多RAW方法来回传输数据.

最后,尽量保持数据尽可能简单.

例如.对某些数据/事件使用COMMANDS/SHORTCUTS.像服务器一样,bytestringtring可以是:0x99,0x45,0x75,0x14,0x04,0x06

其中0x99指:(0x45,0x75)然后0x14的意思:在下面的COORDS大爆PLAYER 0×14(十进制20的球员)移动到(0×04,0×06)

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

对于我的聊天,我有解析每种类型数据的命令.一个用于登录,一个用于广播,用于告知用户的名称等.因此,一旦客户端登录,客户端就接收到命令+一群在线用户.这只是一次转移到客户端.之后,每个连接的客户端也收到了一个"新用户在线"命令,其中包含新用户的名称.每个客户端都使用当前用户和ID维护自己的列表,这样我只需要告诉哪个客户端号码说明文本.这使流量保持在最低限度.对于要做的事情的坐标或命令也是如此."玩家#20向北"等可能是0x14,0x41,0xf0(0x41可以是MOVE,0xf0可以是NORTH,0xf1 EAST等)


这与游戏的物理距离

这个你不能改变,但你可以加入一些限制或让服务器在全球多个地点运行,这取决于你想要制作的游戏类型.Amazon EC2是这类项目的绝佳平台,因为它们拥有遍布全球的数据中心,然后您可以针对这些数据中心对用户网络进行基准测试,然后将用户重定向到最近运行服务器的数据中心.


黑客/作弊

还要记住,如果某些东西变得流行并且你开始赚钱,迟早有人会试图破坏协议或分解帐户以获取访问服务器,信息或作弊以获得游戏中的更多项目/积分.您也可能受到DDOS的攻击,他们用错误的数据轰炸您的网络只是为了使一切崩溃并使游戏无法使用.

一开始不要太介意,只要记住,一旦你上网,你永远不会知道世界上谁或世界上的他们.我不是想让你变得偏执,但有些病人会试图通过欺骗别人来赚钱.

因此,请将此视为您的结构,不要在网络包中显示不需要的数据.不要相信来自客户的数据总是正确的.验证服务器端的数据.

如果您同时有100名活跃玩家,这也需要时间.

但是一旦你这样做,你可以睡得更好,如果它对你来说是一个巨大的成功,我真的希望.


这是我从经验中得到的想法.希望其中一些可能是有用的,尽管如果有100名球员可能,我还没有完全回答.

事实上,我会说:是的100位玩家是可能的,但这取决于它们是否同时移动并且是否存在碰撞测试以及是否接受滞后.