[LayaAir3]带骨骼的3D模型drawcall过高

laya 3.2.6 导入一个模型骨骼,材质只有一个(默认材质),网格只有一个,subMeshCount是1,阴影关闭,骨骼33根,没有动画(带动画的问题也一样),为什么这个模型drawcall是16。
理论是20多个骨骼一批,drawcall应该是2。
同样的模型在unity中drawcall也是2。
已邀请:

拽拽青蛙

赞同来自:

和骨骼索引有关,貌似每个 boneIndice 都会增加一个 drawcall ,希望官方大大能解答。
相关源码 Submesh.ts  #_updateRenderParams,  WebGlSkinRenderElement3D.ts #drawGeometry 。

 

layabox

赞同来自:

麻烦提供一下可重现的测试DEMO工程

拽拽青蛙

赞同来自:

20251210-183357.jpg


20251210-183406.jpg


20251210-183411.jpg

模型包含5个材质,5个子网格, 58 根骨骼 3.3 版本 单/双pass、烘焙前/后 都是5个 OpaqueDC 3.2 版本烘焙前单个Pass 8 个DC ,双pass 15 DC3.2 版本烘焙后单个Pass 5 个DC ,双pass 9 DC

拽拽青蛙

赞同来自:

自顶自顶自顶

Laya_Fred

赞同来自:

您好,目前是分为了5个subMesh,对应5个SkinnedRenderElement,58根骨骼,再根据导出的每个subMesh对应的骨骼索引情况下:
双Pass下,单个renderElement与单个骨骼索引对应单个Pass为一个drawCall。
3.2.x中统计的是所有绘制API的调用统计;
3.3.x中目前也修改为统计SkinnedMesh蒙皮下单个绘制API调用的方式;
2.x中统计基准为skinnedMesh蒙皮下,单个RenderElement对应单个pass为一次drawCall,没有计算骨骼索引循环中调用的gl.drawElements的API调用次数。
由于统计方式导致差异,最终实际调用的绘制API指令还是一致的。可以分别查看WebGLSkinnedRenderElement这个类中实际调用drawElements绘制方法时候进行统计。

拽拽青蛙

赞同来自:

了解3.3和3.2的差异了,目前还存在如下问题:

如下图该裸模的骨骼数是 45,17778 个顶点,5926 个三角形, 骨骼索引循环是 11  , 也就是会有 11 个drawcall.
20251224-183323.jpg

(基础有3个dc)
20251224-182427.jpg

  • drawElements: TRIANGLES, 2793 indices, UNSIGNED_SHORT, 0UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 1296 indices, UNSIGNED_SHORT, 5586UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 1128 indices, UNSIGNED_SHORT, 8178UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 1419 indices, UNSIGNED_SHORT, 10434UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 1605 indices, UNSIGNED_SHORT, 13272UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 1830 indices, UNSIGNED_SHORT, 16482UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(368)..]
  • drawElements: TRIANGLES, 2061 indices, UNSIGNED_SHORT, 20142UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(368)..]
  • drawElements: TRIANGLES, 1338 indices, UNSIGNED_SHORT, 24264UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 1440 indices, UNSIGNED_SHORT, 26940UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(384)..]
  • drawElements: TRIANGLES, 2232 indices, UNSIGNED_SHORT, 29820UnlitVSUNLITFS
  • uniformMatrix4fv: WebGLUniformLocation - ID: 11, false, [..(48)..]
  • drawElements: TRIANGLES, 636 indices, UNSIGNED_SHORT, 34284UnlitVSUNLITFS


但是在其他引擎或者Bake后, drawElements  将一次性提交所有顶点。 
20250714-093758.jpg

drawElements: TRIANGLES, 17778 indices, UNSIGNED_SHORT, 0

为什么会有这样的差异?
 

要回复问题请先

商务合作
商务合作