对于给定数量的 geometries/materials/meshes,Three.js 进行了多少次 webgl.draw 调用

How many webgl.draw calls does Three.js make for a given number of geometries/materials/meshes

我如何计算 drawArrays/drawElements 调用 THREE.renderer.render(场景、相机)的次数?

我假设每个几何体调用一次,具有 materials/mesh 属性的属性。但这很容易出错或不完整。

此外,使用 BufferGeometry 等会有所不同吗?

根据 WestLangley 的评论,我会在 THREE.WebglRenderer 中搜索 renderer.info and look at the logic

drawcalls 本身有点不同。如果您有一个几何体,比如说 cubeGeometry、一个 material cubeMaterialRed 和五个立方体节点 [c1,c2...,c5],您将有五个绘制调用。我相信 three.js 然后会绑定一次几何体,并使用相同的着色器和大部分相同的制服进行五次连续的绘制调用(只有 position/rotation/scale 矩阵应该改变,而红色可以绑定一次)。

如果您有五个不同的 materials [cMatRed, cMatBlue... cMatPink],您将有五个具有相同几何体的绘图调用,但是 material 颜色的统一设置将不同每一个。

如果您有五个不同的几何图形,在五个不同的节点中,则必须在每次绘制调用之前绑定几何图形。

这可以通过在支持时使用实例化来减少。在第二个示例中,它将绑定要实例化一次的几何体,并设置包含 position/rotation/scale 和颜色的属性,将使用这些属性发出一个绘制调用,渲染 5 个几何体,在由提供的位置和颜色中属性。

Three.js 目前没有按照这些路线进行任何批处理和优化,因此将手动完成实例化。

这一切都意味着它与包含几何图形的节点数几乎 1:1 相关。 Object3D->Object3D->Mesh 将产生三个节点,但有一个绘制调用。

rstats 是我正在使用的,它很酷, 您可以获得几乎所有重要信息: 帧速率、内存、渲染信息、webgl drawcall...

它确实有助于提高 threejs 的性能。

来自Jaume Sanchez

的伟大作品

这里是教程: https://spite.github.io/rstats/