HTML5 + Javascript: 游戏网络编程

7
我注意到我已经厌倦了使用高级编程语言(如C#,使用OpenTK)来制作游戏。对于我这种平凡的人来说,C或C ++仍然有点超纲。我突然想回到一些Web开发并尝试制作浏览器游戏 - 当然是用纯HTML5 + JS!虽然我认为我迟早可以自己弄清楚画布,通过互联网的帮助,但我不太确定我应该如何处理网络。
WebSockets似乎很有趣,但它们是否是正确的选择,因为它们仍然相当不成熟? AJAX听起来有点慢和笨重。我不打算制作需要非常低延迟的游戏,但我确实想保持足够低以流畅地进行游戏。
你会有什么建议吗?
6个回答

3

我一定会稍微研究一下这个。非常感谢! - copyboy

3
如果延迟不是很重要,那么您应该只使用众多优秀的AJAX/长轮询库之一。WebSockets可以获得最低的延迟浏览器通信。实际上,WebSockets相当普遍可用,因为有一个WebSockets Flash模拟器web-socket-js,如果没有发现本机WebSocket支持,则可以自动加载。使用web-socket-js仿真将比本机WebSockets具有更高的延迟,但仍然比AJAX/长轮询低。就WebSockets的可用性而言,Chrome和Safari支持本机WebSockets(版本03)。版本03也被Firefox 4.0和Opera 11支持,但默认情况下被禁用。WebSockets自4.2以来在iOS中也是原生支持的。我参加了HyBi(WebSockets)工作组,协议的下一次迭代将解决Mozilla和Opera的安全问题,这个工作正在接近完成。Mozilla和Opera正在积极开发实现,因此我期望他们的下一个主要发布将默认启用WebSockets。但即使如此,由于Flash回退和iOS支持,今天几乎到处都可以使用WebSockets。
如果你也愿意做JavaScript服务器端编程,我会推荐Socket.IO。它是一个node.js后端加上客户端JS库。如果浏览器支持,它默认使用WebSockets,包括web-socket-js闪回,如果WebSockets连接由于某种原因无法工作(或者您选择禁用WebSockets作为传输),则可以使用长轮询。

1
采用Node.js和Socket.io是未来的发展方向。 - PaulM

2
也许你可以多了解一下不同的选项Google会提供给你研究材料。
根据服务器/客户端之间交换的数据量,socket.io 对于最多100人每秒更新10次来说已经足够好了。但请注意,即使是 JavaScript 也会引入很多开销,使用高度特定的方法(数据打包、TCP/IP 数据包缓存等)编写 C++ 网络代码的人仍然抱怨连接和速度问题。

2
如果你想只使用HTML5,WebSocket是一种非常有趣的技术,特别是如果你需要数据尽可能快地移动。这是唯一一种可以让你在与服务器之间双向流式传输数据的技术。如果你的游戏不需要立即更新,那么Ajax就足够了。
此外,你需要问问自己要支持哪些浏览器。WebSocket并不被所有浏览器支持。
如果你愿意考虑其他选项,也可以在浏览器中使用Flash中的RTMFP进行P2P连接。这允许你直接进行“客户端到客户端”的所有通信,而不是通过服务器转发数据。它是基于Flash的,但可以通过桥接实现该功能,使得你可以将所有应用逻辑放在Javascript中。这种技术允许传输更多的数据,而不会过载你的服务器,但最大的缺点是支持性问题。Flash在Unix平台上的支持并不好,而且它是一个第三方插件。

说实话,我不太明白为什么你的回答会得到赞,而不是其他人的回答。我明确表示我想要一个纯粹的解决方案,否则它并没有包含我不知道的很多信息。不是针对你,这不是一个坏答案,只是我认为其他答案更有帮助。 - copyboy
@copyboy 如果你认为其他回答对你更有帮助,你可以接受其中一个。这就是接受答案的意义所在。 - HoLyVieR
@copyboy 如果你觉得其他答案更有帮助,就像乔布斯所说的那样“你做错了”。越早掌握NodeJS和Socket.io,就越好。 - PaulM

1
我建议使用Ajax。在HTML5和JavaScript中进行在线游戏网络通信的关键是尽量减少对服务器的流量(就像其他任何Web应用程序一样),所以您只需要找到一种方法来实现这一点。您有什么样的游戏想法?它是否严格需要连续的互联网连接?
即使如此,Ajax既不慢也不臃肿。它与桌面游戏中的任何其他Internet连接一样快。

我以前用过Ajax做过一些事情 - 没有使用任何库。我认为最大的问题是我必须排队事件,这些事件都将在客户端请求它们时发送给客户端,并将他的操作附加到该请求中。这感觉不太对。 - copyboy
Ajax比其他连接慢,因为当您进行Ajax请求时,即使发送的数据量很小,所有HTTP开销也会随之而来。这对于从客户端向服务器发送数据时是正确的。唯一与任何其他内容一样快的Ajax是Ajax流式传输(从服务器到客户端)。 - HoLyVieR
它可能较慢,但不是很慢。 - Ry-
如果我有足够的声望,我会给这个点踩。用AJAX做这件事是最糟糕的。最好的选择是使用NodeJS。 - PaulM
PaulM,这个问题集中在游戏的客户端(浏览器)方面 - 如果我正确理解Node.js,它是一个服务器端应用程序 - 所以AJAX-bashing可能没问题,但Node.js不是正确的答案,或者你是怎么想的? - Dr. Jan-Philip Gehrcke

1

对于网络编程,您可能希望尝试使用现有的框架,如联合平台。这是一个纯JS/HTML5编写的多用户绘图应用程序,没有使用WebSockets:

http://www.unionplatform.com/?page_id=2762

还值得一看的是www.socket.io。socket.io提供了一个原始的websocket封装器,带有xhr故障转移功能,但没有更高级别的API(例如,没有房间、用户、账户、分数等数据共享/管理)。

Colin


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接