使用React创建一个100K多人平铺游戏

时间:2015-03-22 15:01:56

标签: javascript firebase reactjs reactjs-flux

我正在学习React。

我想创建一个带有基本图块板的游戏​​(例如http://richard.to/projects/beersweeper/,但是图块可以有两种状态('可用'或'已经点击')。

就速度而言,React看起来很有趣,因为它的虚拟DOM /差异,我只能调整已点击的瓷砖内的css和文字(这样它们在视觉上会有所不同,而不是任何人都没有点击的那些)。

我的目标(以及个人挑战哈哈)是让这个游戏可以通过 1000个同时玩家来玩,他们可以在10万个瓷砖板上点击他们想要的地方。(在客户实时分配瓦片)状态将使用Firebase

完成

我应该使用基本的标准React及其内置功能(onclick事件,ts听众......)还是只有-React才能在100K磁贴上为1000人实时启用许多事件/监听器任何用户都可以点击任何地方(在可用的瓷砖上)?

我应该使用替代/辅助工具和技术,如画布,React Art,GPU加速,webgl,纹理图册......?

2 个答案:

答案 0 :(得分:5)

WebGL是正确的答案。使用起来也很复杂。

但是根据瓷砖的大小,React可以工作,但无论你怎么做,你都无法正常渲染100k dom节点。相反,您需要渲染用户可见的瓷砖子集。

要取消这样的东西,你需要有很多优化的代码,而firebase很可能不会达到标准。我推荐基于websockets的二进制协议和有意义的数据库(快速查找多个数字索引范围和订阅)。

最终,我可能会选择:

  • webgl(比较three.js和pixi.js)
  • golang中的自定义数据服务器(由maria或aws' s极光等mysql引擎管理持久性/回退)
  • 用golang编写的websocket服务器
  • websockets(没有包装库,二进制协议)

对于websocket服务器,golang over node.js的唯一原因是CPU性能,这意味着更低的延迟和每台服务器更多的客户端。它们在网络方面的表现大致相同。

你可能会忽略大部分内容,但是要明白,如果你确实遇到了性能问题,那么为这些部分切换一些部分会有所帮助。

做一个处理2个并发用户和1000个磁贴的原型,并从那里开始。按优先顺序排列:

  1. 不要渲染100k dom节点!
  2. webgl而不是dom
  3. 二进制websocket协议,通过socket.io或类似(不是firebase)
  4. 自定义数据服务器
  5. 二进制websocket协议不使用socket.io(例如节点中的ws包)
  6. websocket服务器(不是那么重要,也许永远不会)

答案 1 :(得分:3)

  

很多人使用React作为MVC中的V。

我相信react适用于UI,但您应该问自己服务器端逻辑是什么,您仍需要考虑MC < / p>

如果您要同时加载1000个用户,则关键字scalable将成为您的朋友。

另外,您应该查看Node.js以获取服务器端服务。 Express.js为快速实施,最后Pomelo.jsjs游戏服务器实施,基于node.js

关于表现问题.. WebGL很可能会提升你的表现。在这里,您可以获得有关该主题的精彩教程:https://github.com/alexmackey/IntroToWebGLWithThreeJS

如果您想在没有GL语言的情况下构建它,您应该深入了解JavaScript使用动态pseudo-class创建自己的data bindings库。否则,您最终可能会使用一小部分强大的框架,这只会降低您的API

  

我会限制使用canvas,因为它们适用于model可视化而非游戏front-end。结帐d3.js因为它太棒了,不幸的是性能问题。


  

在这里,我写了一个很好的小提琴,它创造了100x100矩阵的悬停,并且性能不是很好。您可以轻松调整它以获得100k元素矩阵:https://jsfiddle.net/urahara/zL0fxyn3/2/


  

编辑:WebGL是唯一合理的解决方案。