我们需要开发一款具有实时性能的多人游戏。 这需要在全局范围内运行(美国、欧洲、亚洲的服务器),并支持巨大的流量。使用 Google Cloud 服务进行托管。
我们正在考虑 Jam with Chrome、Chrome Maze 或 Cube Slam 等引用。
游戏:
- 2 名玩家挑战一场比赛
- 我们需要同时显示两个玩家的进度
- 每场比赛可以持续大约 30 到 45 秒
托管:
我们显然会在 AppEngine 上托管网站,自动缩放, 但正在考虑实时服务器的 2 种解决方案:
将 websocket 服务器与 Compute Engine 结合使用
就像他们用 Chrome、Maze 等为 Jam 所做的那样。
开发我们自己的 websocket 服务器(技术待定),部署在欧洲、美国、亚洲的数据中心,处理扩展、它们之间的同步、服务器和客户端的计算延迟问题等。
但这在技术上非常具有挑战性,因为我们的时间非常紧迫,而且现在缺少管理系统和网络人员。或者使用 Channel API
我们理解它不是一个websocket平台,实时性较低。
但这对我们和我们拥有的时间来说会更加简单和安全。
所以,我们也想了解更多。
无论如何,我们认为我们可以在前端使用一些图形技巧,使其看起来像实时的,但这实际上取决于我们是否有 100~500 毫秒或 500 毫秒~10 秒的延迟。
一些问题:
- 不同解决方案的延迟范围值是什么样的?
(Jam w/Chrome 使用 GCE 得到 100ms,Channel API 可以达到几秒吗?) - Channel API 服务器将如何处理高流量,缩放是如何工作的,延迟会不会非常高? ( channel 文档中没有相关信息?)
- 如果法国人和美国人一起玩,连接到不同的服务器,等待他们同步,怎么办?
- 有什么建议或经验可以分享吗?
- 有什么有趣的阅读或观看吗? (看过一些但不是很准确)
- 还有其他解决方案吗?
感谢您的任何帮助评论!
编辑:
- 只有 2 名玩家连接在一起,可能来自不同的世界区域,不需要广播。
- 我们可以找到一些前端技巧来避免服务器端处理。这是 2 名玩家之间的比赛,所以我们实际上只需要比较他们的进度,真正的获胜者决议并不那么重要,因为没有真正的东西可以赢,这更有趣。
最佳答案
如果您需要一个服务器来处理数据:
我肯定会在 Compute Engine 上使用 websockets!
Channels API 慢得多,而且非常不可预测(延迟因消息而异)!数据必须转到 Channels 服务器,后者将其发送到 App Engine 实例,App Engine 实例必须向 Channels 服务器发出请求,后者会将消息推送到客户端。如果你想降低延迟,那有太多事情要做!
这是一个 Channels API 压力测试:
http://channelapistresstest.appspot.com/
尝试多次点击“发送 5”按钮,您会看到延迟数字上升到几秒。
Channels API 在重负载下也非常昂贵(它可能无法很好地扩展,即使 Google 当然可以通过更多实例解决这个问题)。
要降低延迟,地理定位非常重要。使用 Compute Engine 上的 websocket 服务器,您可以将欧洲访问者发送到谷歌的欧洲数据中心,将美国访问者发送到美国数据中心(使用 AppEngine 将提供的地理位置 header )。您无法使用 Channels API(或应用程序引擎,您的所有消息都通过它进行中继)进行此类控制。也许 Google 有 Channels API 的边缘服务器(我不知道),但如果您的 AppEngine 实例在地球的另一边,那没关系。
如果您不需要服务器来处理数据:
您应该与 WebRTC 建立点对点连接,直接在用户的浏览器之间发送内容。那就是 Cube Slam 所做的。 (WebRTC 需要一些初始握手(“信号”),以便两个对等点可以找到对方,并且 Channels API 可以很好地进行握手,这只是建立点对点连接的几条消息。)
WebRTC DataChannels API 将为您提供一个类似 websocket 的漂亮界面,例如 channel.onmessage = function(e) { yadayada()... };
和 channel.send("yadayada ");
在对等点之间发送您的数据。
有时,WebRTC 无法建立点对点连接。然后它将回退到 TURN 服务器,该服务器在对等点之间中继流量。 Cube Slam 使用在 ComputeEngine 上运行的 TURN 服务器(在欧洲和美国都是为了降低延迟),但这只是在无法实现真正的点对点时的备用方法。
关于google-app-engine - Google Cloud 上的实时游戏 : Channel API or Compute Engine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17094626/