gpt4 book ai didi

opengl-es-2.0 - 使用与以前相同的值调用 glBindBuffer、glUseProgram 等是否效率低下?

转载 作者:行者123 更新时间:2023-12-01 12:37:55 27 4
gpt4 key购买 nike

我读到在 OpenGL 2(尤其是 ES)中优化非透明对象渲染顺序的最佳方法是优先避免上下文更改(绑定(bind)不同的缓冲区、着色器程序等)而不是深度排序。

如果你用一个已经绑定(bind)的缓冲区调用 glBindBuffer,或者用一个已经是当前程序的着色器程序调用 glUseProgram,等等,它们是否仍然会导致低效的管道刷新,或者库是否足够聪明以识别它们作为 NOOP?如果我可以在需要时绑定(bind)所有内容,而不必跟踪已经绑定(bind)的内容并检查它,这将使我的代码更简单。

最佳答案

也许吧。这个真的不能笼统的回答。它完全取决于实现。

驱动程序是否应该检查冗余状态更改是一个有点哲学性的讨论,您不会就此达成共识。因此,您应该期望不同的供应商以不同的方式处理它,而且我什至不一定假设它对同一驱动程序中的所有状态的处理都是一致的。

如果您的目标是特定平台,则应该对其进行衡量。幸运的是,这很容易进行基准测试。如果您想涵盖广泛的平台/供应商,我会尽量减少冗余状态更改。至少如果你可以选择相对便宜地做到这一点。如果为此增加大量开销,则弊大于利。

对此意见不一的主要原因是检查冗余状态更改并非完全免费。如果司机这样做,开销将适用于每个人。写得很好的应用程序(不会进行不必要的状态更改)为有利于写得不好的应用程序的优化付出了代价。你可以说这是非常不公平的。

实际上,通常会进行这些检查,尤其是在状态更改本身相当昂贵的情况下。当然,如果状态更改非常便宜,则不值得添加检查。这些检查通常是由重要应用程序/游戏基准的性能优化驱动的。不幸的是,许多应用程序/游戏使用 OpenGL 的效率非常低,驱动程序必须为重要的基准测试产生尽可能好的结果。在这些情况下,过滤掉冗余状态更改是一种常见的优化。

关于opengl-es-2.0 - 使用与以前相同的值调用 glBindBuffer、glUseProgram 等是否效率低下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27890361/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com