rea*_*alh 3 opengl-es-2.0 opengl-2.0
我读到,在 OpenGL 2(尤其是 ES)中优化非透明对象渲染顺序的最佳方法是优先考虑避免上下文更改(绑定不同的缓冲区、着色器程序等)而不是深度排序。
如果您使用已绑定的缓冲区调用 glBindBuffer 或使用已是当前程序的着色器程序调用 glUseProgram 等操作,它们是否仍然会导致低效的管道刷新,或者库是否足够聪明,可以将它们识别为 NOOP?如果我可以在需要时绑定所有内容,而不必跟踪已绑定的内容并对其进行检查,那么我的代码将会变得更简单。
或许。这确实不能笼统地回答。它完全依赖于实现。
驱动程序是否应该检查冗余状态更改是一个有点哲学的讨论,您不会对此达成共识。因此,您应该期望不同的供应商以不同的方式处理它,我什至不一定假设它对于同一驱动程序中的所有状态进行一致的处理。
如果您针对特定平台,则应该对其进行衡量。幸运的是,这很容易进行基准测试。如果您想覆盖广泛的平台/供应商,我会尽量减少冗余的状态更改。至少如果你可以选择相对便宜地做到这一点的话。如果为此增加大量开销,则可能弊大于利。
对此存在不同意见的主要原因是检查冗余状态更改并不是完全免费的。如果司机这样做,那么每个人都会承担费用。因此,编写良好的应用程序(不会进行不必要的状态更改)会为有利于编写不良的应用程序的优化付出代价。你可能会说这是非常不公平的。
实际上,经常会进行这些检查,特别是在状态更改本身相当昂贵的情况下。当然,如果状态更改非常便宜,则不值得添加检查。检查通常由重要应用/游戏基准的性能优化驱动。不幸的是,许多应用程序/游戏使用 OpenGL 的效率非常低,驱动程序必须为重要的基准测试提供最佳的结果。在这些情况下,过滤掉冗余状态更改是一种常见的优化。