用于快速呈现数千个DOM元素的Javascript库

时间:2015-10-23 07:47:55

标签: javascript html angularjs dom canvas

我最近玩过JavaScript,我正在创建一个网页游戏(纯HTML + CSS + JS,没有服务器后端)。这个游戏的主要目的是在2D地图上行走。 (类似于https://alexnisnevich.github.io/untrusted/)。

我目前的筹码是:

  • 用TypeScript编写的代码
  • 用于渲染的AngularJS
  • 和LESS + uglify进行一些缩小

我创建了一些基本功能,现在我将地图大小从10x10(100个DOM元素)增加到100x100(10 000个DOM元素)。这是Angular遭受的地方。 ng-repeat指令需要大约5秒来渲染这么多元素(100x100对我来说是小地图,我想要一些更大的环境让用户进入)

问题:

  1. 好像我选择了糟糕的库进行渲染。对于成千上万的元素,Angular真的很慢。是否有更快的库可以渲染更多的元素(并重新渲染那些已经改变的元素?它可能没有检查,我没有问题在手动更改元素上触发渲染)
  2. 或者我选择DOM元素作为地图错误?我应该使用画布吗?我使用DOM元素的主要原因是因为我想要所有这些事件,地图上的每个字段都是可点击的,并且当鼠标悬停在该元素上时提供工具提示。用帆布可以这样做吗?有什么好的用于创建画布2D游戏的库(我从未使用过画布)?

1 个答案:

答案 0 :(得分:5)

我写了十几个HTML5游戏。为了获得最佳结果,请不要使用框架/库。与通常以十分之一速度运行的本机应用程序相比,Javascript很慢。由于游戏需要大量重复的渲染操作,任何额外的开销都会对性能产生负面影响。

JavaScript和HTML5已经提供了出色的内置API,用于渲染,音频,视频,用户输入(键盘,鼠标,触摸等)和资源管理。框架和库只是添加了另一层抽象,通常这个抽象层旨在提供一系列功能,而大多数游戏或游戏的特定部分不需要或使用大部分功能。每个不需要的条件,函数调用和内存分配都会对性能产生负面影响。

那说框架还有空间。但这应该只用于设置和浏览器兼容性。 JQuery专为此而设计(不是为了速度)。使用JQuery加载和设置页面,然后使用游戏循环不要使用jquery。仅将其用于游戏的非性能部分。

为获得最佳性能,您的目标是每秒60帧。

  • 请勿使用DOM或CSS。创建一个canvas元素和输出 一切都那样。你将不得不使用它,但每次你触摸DOM,你会杀死20多个游戏精灵/实体/瓷砖。
  • 使用画布2D API或webGL(webGL更快,但有更多 复杂的API)直接。
  • 不要使用SVG或画布2D矢量渲染调用(例如ctx.lineTo, ctx.arc)他们非常慢。如果你需要基于矢量的图形 考虑学习webGL API
  • 直接使用HTML5音频和视频API。它们非常坚固耐用 使用方便。你将花费相同的时间学习如何 在学习如何使用现有API时使用框架
  • 管理您的内存使用情况。在游戏循环中你不应该 总共产生垃圾收集(GC)。例如,如果你有重生 实体很容易创建一个新对象并取消引用旧对象。大多数框架都是这样做的。这会影响性能。在游戏过程中不要取消引用。不是删除实体并创建新实体,而是使用新实体分配其属性。

更新2018年 以下几点仍然部分适用,但在写入和更新之间的时间内,有关ES6功能的一些改进。虽然仍然没有达到速度,但它们不再是数量级的慢。

  • ES6有很多新功能,类,forEach,let, 解构,传播运营商等。不要使用任何这些。 他们是如此令人难以置信的低效率,他们是亲吻 为你的游戏而死。它们非常糟糕,使用polyfill(Javascript 替换内置函数的函数)是一个完整的顺序 幅度更快(10倍+)。使用for从不Array.forEachArray.map等等.for循环比快达100倍 内置迭代器。 '让'对于块范围接缝来说,这是一个好主意但是 没有浏览器对此进行优化。使用let声明的变量是 同样快。它是块范围的开始,需要 解释器分配内存,范围结束它 取消引用并引发GC。

  • 许多人仍然相信面向对象的OO编程 框架使用OO作为其代码的基础。 OO有它的位置 那个地方是大型团队编写,多重修订公司 (企业)项目。 OO适用于程序员/代码猴子 与用户/游戏玩家无关。 Javascript必须被强制 符合OO范式,并在此过程中介绍 开销,开销将对您的游戏产生负面影响。使用Javascript 专为" ad hoc"结构化,它非常擅长。 学习如何使用闭包,不要陷入OO范式 你想写快速游戏。

所以现在我已经让你远离你看IDE的框架,并想知道我从哪里开始。 从这里开始 MDN并了解如何使用现有的API而非某些框架,需要花费相同的努力才能学习,但最终您将更接近硬件编码并生成更快的游戏。 / p>

物理学,复杂的分层动画,多人状态管理和通信怎么样? Github是一个很好的起点,小型目标API是最好的。不要只是下载一个git并将其添加到你的游戏中。下载并撕开它,删除任何你不想要的东西,只需要你需要的东西,重写它以满足你的需要和你的需要。

所以你还想要一个框架?好吧,我不怪你,我有40年的时间来写游戏,很容易说你自己做。

我建议Phaser我已经仔细研究了它,虽然没有完全优化,但它有良好的社区支持,编写得很好且易于理解,并且提供了我所见过的最接近游戏的硬件解决方案框架。

最后一件事。不要写一个会在阳光下的每个设备上运行的游戏,手机游戏永远不会在PC上运行,反之亦然。响应式设计适用于网页"页面"对于高性能游戏而言,这不是一件事,除非你有多年的编码经验,或者你只是在日常工作之间填补时间。

记住程序员写游戏,游戏设计师梦想。