WebGL绘制调用真的非常慢吗?

use*_*048 2 optimization webgl

我有一段时间没有使用桌面OpenGL,但WebGL似乎很慢.只需几百个相对简单的绘制调用,FPS就会进入转储阶段.

我认为我的代码非常优化.它渲染模型,其中每个模型由网格+材质的批次组成,每个批次都使用实例渲染进行渲染,以便渲染模型的所有实例,每个实例都有自己的每个实例数据,如转换等.

有什么我想念的吗?

作为旁注,正常渲染比实例渲染更慢,正如预期的那样,但是几百个调用仍然会破坏帧速率.

gma*_*man 6

相比什么慢?Unity和Unreal都导出到WebGL并且速度合理.我得到6000+平局来电60fps的这一演示在我早期的2015年MBP在Chrome集成显卡模式下运行(ATM懒得切换到独立哪个会更快).我将它设置为4000鱼,然后将其粘贴到JavaScript控制台中g_fishTable[0].num[8] = 6000.即使把它带到16000个绘制电话,我仍然得到43fps.

你有可能产生垃圾吗?举个例子

 gl.uniform4fv(someLocation, [1, 2, 3, 4]);  // Generates garbage
Run Code Online (Sandbox Code Playgroud)

该行创建可能每次都创建一个新数组.

同样,你是在每一帧制作新的矩阵,还是重新使用旧的矩阵,以确保你不会产生垃圾.

类型数组也应该比标准JavaScript数组更快

换一种说法

var vector = [0, 0, 0, 0];   // slow
Run Code Online (Sandbox Code Playgroud)

VS

var vector = new Float32Array(4);  // fast
Run Code Online (Sandbox Code Playgroud)

创建它们可能会或者可能不会更快,但这应该无关紧要,因为您应该在初始化时创建它们而不是渲染时间.尽管在每种情况下AFAIK都会使用typedarrays的用法会更快.

也许你应该检查JavaScript分析器.