Performance 通过最小化着色器/状态更改优化WebGL性能的指南

Performance 通过最小化着色器/状态更改优化WebGL性能的指南,performance,opengl-es,3d,webgl,opengl-es-2.0,Performance,Opengl Es,3d,Webgl,Opengl Es 2.0,我试图了解WebGL用于渲染大型内部场景的实用性,包括100K的三角形。这些三角形分布在许多对象上,场景中有许多材质。另一方面,没有运动部件。而且材质往往相当简单,主要基于纹理贴图。有很多纹理贴图共享。。例如,场景中的所有椅子将共享一个公共地图。还有一些多纹理-一种材质中最多覆盖三种纹理 我做了一些实验和阅读,发现在渲染过程中频繁切换材质会减慢速度。例如,假设每次显示对象时都设置了新材质,则具有200K三角形的场景将具有显著的性能差异,这取决于有10个还是1000个对象 因此,如果性能很重要,那

我试图了解WebGL用于渲染大型内部场景的实用性,包括100K的三角形。这些三角形分布在许多对象上,场景中有许多材质。另一方面,没有运动部件。而且材质往往相当简单,主要基于纹理贴图。有很多纹理贴图共享。。例如,场景中的所有椅子将共享一个公共地图。还有一些多纹理-一种材质中最多覆盖三种纹理

我做了一些实验和阅读,发现在渲染过程中频繁切换材质会减慢速度。例如,假设每次显示对象时都设置了新材质,则具有200K三角形的场景将具有显著的性能差异,这取决于有10个还是1000个对象

因此,如果性能很重要,那么场景应该按材质进行排序,以最小化材质切换。我要寻找的是关于如何考虑各种状态变化的开销的指导方针,以及我从哪里得到最大的回报。比如说,

  • 例如,
    gl.useProgram()
    gl.uniformMatrix4fv()
    gl.drawerelements()
  • 我是否应该尝试编写ubershader来最小化着色器切换
  • 我是否应该尝试聚合几何体以最小化
    gl.draurements()
    调用的数量
我意识到里程数可能因浏览器、操作系统和图形硬件而异。我也不是在寻找英勇的措施。只是一些已经在快速制作场景方面有经验的人提供的指导。我要补充一点,虽然我过去有一些固定管道OpenGL编程的经验,但我对WebGL/OpenGL ES 2.0的工作方式还是比较陌生。

你读过吗?诚然,它关注的是directX,但推理在较小程度上也适用于Open/WebGL:每个API调用在CPU上都有很大的开销。建议使用API的所有选项共享纹理,使用实例(如果可用),编写复杂的着色器以避免许多绘制调用。因此,如果你能在一次通话中把整个房子画成一个网格,那就比每个房间1000次通话要好。建议编写UberShader,但主要是因为它允许您删除绘制调用,而不是因为GPU状态切换很昂贵


这是以最新的硬件为前提的。对于低端平台(iPad?)或英特尔GMA芯片,瓶颈将出现在其他地方(如软件顶点处理)

谢谢,这有点帮助。至少我学会了一个新的艺术术语:“批量”。谷歌搜索“nvidia”批次,批次,批次”会带来有用的东西。很明显,游戏社区已经为这件事苦恼了很长时间。