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

时间:2011-01-25 21:21:40

标签: c++ actionscript-3 sockets flash

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

详情

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

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

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

  1. 客户端使用AS3中的二进制Socket类连接到服务器
  2. 服务器要求验证,客户端发送名称和缩略图。
  3. 服务器等待4个客户端连接(某些匹配等)
  4. 服务器选择4个客户端并使它们在单独的线程(作为一个团队合并)上运行
  5. 客户将其绩效分数发送到服务器范围1-100。
  6. 服务器使最好的客户端成为物理主机和其他3个从属服务器
  7. 主机游戏设置关卡,在关卡中创造约1-100个形状(主要形状和复杂形状,如桥梁,马达,弹簧)
  8. 主机每次获取形状的所有更新属性并将它们发送给客户端(x,y,旋转,睡眠)
  9. 客户端将所有形状属性应用于正确的形状
  10. 我尝试了不同的时间步骤并注意到,直到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可以在发送之前在缓冲区中堆叠大量数据包。例如,如果我一次发送大量数据包,它会将它们堆叠起来并将它们一起发送到服务器。通过更快的时间步长,您无法在客户端(从属)端获得更多更新,但在同一数据包行中获得更多更新。

    尝试

    1. 使用新的RTMFP(udp&amp; p2p)协议进行更新。 (性能稍好但可靠性较差)
    2. 使用c ++而不是Air(使用ServerSocket)对我的整个套接字服务器进行编码(性能更好,但注意到滞后部分不是服务器而是Flash Player)
    3. 使用ByteArray压缩方法和AMF序列化格式(性能大致相同,但c ++服务器无法反序列化消息)
    4. 你们有没有想过在Flash Player中每次执行这么多的更新请求都是可能的。

      发现

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

      很抱歉这篇长篇文章。

3 个答案:

答案 0 :(得分:7)

答案 1 :(得分:1)

  

问题:是否可以通过套接字连接更新Flash Player中的100多个对象?

Phosphor 2 seems to pull it off.

答案 2 :(得分:1)

也许最好的选择是在服务器和每个客户端上执行物理,同步(服务器对象位置覆盖客户端)。这样所有客户都可以获得相同的滞后。在差异很小(应该是这样)之前,修正不会引起注意。如果您使用Box2D,则您已准备好AS3和C ++版本。但这是完全不同的架构,值得3个月自行实施。在空/简单的舞台上你会得到什么延迟?在有限的时间内,简化可能是您唯一的选择。