【发布时间】:2014-01-22 08:34:15
【问题描述】:
我正在编写一个 JavaScript 游戏。这个游戏显然需要不断地渲染一个屏幕,使用canvas,它必须是Uint8Array(width * height * 4)(就像Canvas的ImageData使用的那样)。为了测试预期的 FPS,我尝试用白色填充该数组。令我惊讶的是,性能是mediocre。在 150 fps 的高端计算机中,我几乎无法用白色填充 1000x1000 位图。考虑到这是最佳性能,没有任何游戏逻辑运行,最终结果可能会低得多。我的问题是:为什么性能这么低,我可以做些什么来改进它?
【问题讨论】:
-
你真的需要在这里展示一些代码,因为细节很重要。画布已经是双缓冲的,所以你需要缓冲并不明显。特别是因为缓冲区副本可以使游戏崩溃,直接绘制可以运行。在屏幕上绘制(硬件加速)时的性能可能比在屏幕外(这里的一些浏览器切换到软件渲染)要好得多。我担心你无法从这个测试中推断出任何东西。
-
画布和使用 ImageData 存在很多问题。 #1 您将数据放入 ImageData.data 字段。 #2 你调用 putImageData,系统很可能使用 CPU 将你的数据预乘以 alpha(因为画布仅在内部使用预乘 alpha)到另一个缓冲区。在 Chrome 上,缓冲区必须转移到另一个进程,GPU 进程,这也是另一个副本,之后必须调用 glTexImage2D 将数据上传到纹理,因为画布在大多数硬件上都是硬件加速的。当它全部是软件时 putImageData 更快,但仅此而已。
标签: javascript canvas bitmap webgl