为了试验 WebGL,我编写了一个在画布上渲染一堆 2D 精灵的脚本。所有的精灵都只是纹理矩形。每个矩形上的纹理都是相同的。他们在每一帧中随机改变他们的位置。
我在 Windows 上看到一个奇怪的问题:在 Chrome 中,帧速率几乎比 Firefox 低 2 倍(在 Mac 上,Chrome 和 Firefox 具有相似的帧速率)。Chrome 的 Windows 版本中是否存在影响 WebGL 性能的已知问题?
另一个问题是,当我将精灵计数从大约 500 增加到 5000 时,帧速率从几乎每秒 60 帧下降到每秒 20-30 帧。如果我错了,请纠正我,但对于现代显卡来说,渲染 5000 个纹理四边形不应该是相对轻的工作量吗?以 30 fps 运行的现代游戏可能具有更高的多边形数量。
这是我的渲染的工作原理:
我创建了三个 WebGL 缓冲区:用于顶点位置、纹理坐标和顶点索引。这些缓冲区中的每一个都有足够的空间来容纳 5000 个精灵。我还创建内存类型数组来保存顶点位置、纹理坐标和索引(
Float32Array
用于顶点和纹理坐标,Uint16Array
用于索引)。在每一帧上,当添加一个精灵时,我将顶点、纹理坐标和索引数据写入内存数组(此时,没有发生 WebGL 调用)。
在帧结束时,我使用
bufferSubData
并调用将内存数组中的数据上传到 WebGL 缓冲区中drawElements
。
难道我做错了什么?5k精灵的帧率不应该很高吗?最后,为什么 Chrome 的帧率比 Firefox 低?