【发布时间】:2011-04-14 08:05:17
【问题描述】:
问题:是否可以通过套接字连接更新 Flash Player 中的 100 多个对象?更多细节和我自己的尝试如下!
详情
在实习期间,我有时间创建一个多人物理游戏。我稳定地工作了三个月。我的实习即将结束,我无法完成我的游戏。
我的问题是每个时间步都很难将多个数据包发送到服务器并返回。我发送的数据包是其他客户端的对象和鼠标的位置更新。
我将尝试解释网络/游戏流程。
- 客户端使用 AS3 中的二进制 Socket 类连接到服务器
- 服务器要求验证,客户端发送名称和缩略图。
- 服务器等待 4 个客户端连接(一些匹配等)
- 服务器选择 4 个客户端并让它们在单独的线程上运行(合并为一个团队)
- 客户端将他的性能分数发送到服务器范围 1-100。
- 服务器将最佳客户端作为物理主机和其他 3 个从机的主机
- 主机游戏设置关卡并在关卡中制作大约 1-100 个形状(主要形状和复杂形状,如桥梁、马达、弹簧)
- 每个时间步,主机都会获取形状的所有更新属性并将它们发送给客户端(x、y、旋转、睡眠)
- 客户端将所有形状属性应用于正确的形状
我尝试了不同的时间步长,并注意到在 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) 协议进行更新。 (性能稍好,但可靠性较差)
- 用 c++ 而不是 Air(使用 ServerSocket)对我的整个套接字服务器进行编码(性能更好,但注意到滞后的部分不是服务器,而是 Flash Player)
- 使用ByteArray压缩方式和AMF序列化格式(性能差不多,只是c++服务器不能反序列化消息)
你们认为在 Flash Player 中是否有可能在每个时间步处理如此多的更新请求。
发现
ActionScript 3.0 中有一个多人模式的棍子竞技场游戏。他们使用了很多技巧,即便如此,我还是得到了大约 300 毫秒的 ping,它只会不断更新玩家(一个大厅里有 4 个玩家)。
抱歉,帖子太长了。
【问题讨论】:
-
主机是否通过服务器向其他客户端发送数据?与服务器计算物理时相比,客户端将获得双倍的往返时间。
-
从 1client->server->3client 到 server->4clients 的唯一区别是有一个客户端发送数据包而不是接收数据包。我曾经决定在客户端计算物理,因为当有很多游戏正在进行时,它会大量卸载服务器。也许你是对的,我能不能更好地在服务器端用 C++ 做物理。
-
我想知道客户端是否可以直接将数据发送给其他人(并通过广播)。 AIR 已经有一些 p2p 功能,不确定浏览器内的 Flash。
-
您可以从 Adobe 自己查看 Stratus 页面。它是一个 p2p udp 协议。它仍然是 Flash Player 10.1 中的一个测试版,它首次向公众发布。
标签: c++ actionscript-3 sockets flash