我最近玩过JavaScript,我正在创建一个网页游戏(纯HTML + CSS + JS,没有服务器后端)。这个游戏的主要目的是在2D地图上行走。 (类似于https://alexnisnevich.github.io/untrusted/)。
我目前的筹码是:
我创建了一些基本功能,现在我将地图大小从10x10(100个DOM元素)增加到100x100(10 000个DOM元素)。这是Angular遭受的地方。 ng-repeat
指令需要大约5秒来渲染这么多元素(100x100对我来说是小地图,我想要一些更大的环境让用户进入)
问题:
答案 0 :(得分:5)
我写了十几个HTML5游戏。为了获得最佳结果,请不要使用框架/库。与通常以十分之一速度运行的本机应用程序相比,Javascript很慢。由于游戏需要大量重复的渲染操作,任何额外的开销都会对性能产生负面影响。
JavaScript和HTML5已经提供了出色的内置API,用于渲染,音频,视频,用户输入(键盘,鼠标,触摸等)和资源管理。框架和库只是添加了另一层抽象,通常这个抽象层旨在提供一系列功能,而大多数游戏或游戏的特定部分不需要或使用大部分功能。每个不需要的条件,函数调用和内存分配都会对性能产生负面影响。
那说框架还有空间。但这应该只用于设置和浏览器兼容性。 JQuery专为此而设计(不是为了速度)。使用JQuery加载和设置页面,然后使用游戏循环不要使用jquery。仅将其用于游戏的非性能部分。
为获得最佳性能,您的目标是每秒60帧。
更新2018年 以下几点仍然部分适用,但在写入和更新之间的时间内,有关ES6功能的一些改进。虽然仍然没有达到速度,但它们不再是数量级的慢。
ES6有很多新功能,类,forEach,let,
解构,传播运营商等。不要使用任何这些。
他们是如此令人难以置信的低效率,他们是亲吻
为你的游戏而死。它们非常糟糕,使用polyfill(Javascript
替换内置函数的函数)是一个完整的顺序
幅度更快(10倍+)。使用for
从不Array.forEach
,
Array.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上运行,反之亦然。响应式设计适用于网页"页面"对于高性能游戏而言,这不是一件事,除非你有多年的编码经验,或者你只是在日常工作之间填补时间。
记住程序员写游戏,游戏设计师梦想。