我有一段时间没有使用桌面OpenGL,但WebGL似乎很慢。 只需几百个相对简单的绘制调用,FPS即可进入转储阶段。
我认为我的代码非常优化。 它渲染模型,其中每个模型由网格+材质的批处理组成,每个批处理都使用实例渲染进行渲染,以便渲染模型的所有实例,每个实例都有自己的每个实例数据,如转换等。 / p>
我有什么遗失的吗?
作为旁注,正常渲染比实例渲染更慢,正如预期的那样,但仍有几百个调用会破坏帧速率。
答案 0 :(得分:6)
相比什么慢? Unity和Unreal都导出到WebGL并且速度合理。在我的2015年早期MBP中,我以60fps on this demo获得了6000多次绘制调用,在集成图形模式下运行的Chrome(ATM太懒,无法切换到离散状态,速度更快)。我将其设置为4000 fish,然后将其粘贴到JavaScript控制台g_fishTable[0].num[8] = 6000
中。即使把它带到16000个电话,我仍然得到43fps。
你有可能生成垃圾吗?作为一个例子
gl.uniform4fv(someLocation, [1, 2, 3, 4]); // Generates garbage
该行创建可能每次都会创建一个新数组。
同样,您每帧都会制作新矩阵或重新使用旧矩阵,以确保您不会产生垃圾。
同样,类型数组应该比标准JavaScript数组快
换句话说
var vector = [0, 0, 0, 0]; // slow
VS
var vector = new Float32Array(4); // fast
创建它们可能会或者可能不会更快,但这并不重要,因为您应该在初始化时创建它们而不是渲染时间。虽然在每种情况下AFAIK都会使用typedarrays的用法会更快。
也许你应该查看JavaScript profiler。