glColorPointer性能,浮点数或字节数更好?

时间:2015-11-28 02:26:43

标签: opengl

对旧项目进行一些维护,并由客户询问是否可以提高性能。我已经完成了我知道的部件并且可以轻松测试但是我测试了

glColorPointer(4,GL_UNSIGNED_BYTE,...,...) VS glColorPointer(4,GL_FLOAT,...,...)

我可以看到我可以测试它的少数几台机器没什么区别。显然这意味着它不是瓶颈但是因为这是我第一次遇到可以访问两种颜色格式的情况,这也是我第一次想知道2之间是否存在速度差异。

我期待答案是内部opengl适配器使用浮动颜色,所以最好在可用时使用float,但是任何人都有更明确的答案呢?

编辑:客户端有几十台大约10年的机器,如果这些机器有所作为,那么该项目将在这些机器上使用

1 个答案:

答案 0 :(得分:2)

实际上没有普遍有效的答案。你通过测试做了正确的事。

至少在台式机GPU上,假设它们将在内部运行32位浮点数是相当安全的。在移动GPU上,较低精度的格式更常见,您可以使用着色器代码中的precision限定符来控制它。

假设内部使用32位浮点数,则有两个相互竞争的考虑因素:

  1. 如果您使用其他格式指定颜色,例如GL_UNSIGNED_BYTE,则在获取顶点数据时需要进行转换。
  2. 如果以更紧凑的格式指定颜色,则顶点数据使用较少的内存。这也会导致获取数据所消耗的内存带宽减少,缓存未命中次数减少,并且可能减少缓存污染。
  3. 其中哪些更相关实际取决于确切的硬件和总体工作负载。如果硬件支持字节格式作为固定功能顶点提取硬件的一部分,则项目1的格式转换可能几乎是免费的。否则,它可能会增加一点开销。

    节省内存带宽总是一件好事。所以默认情况下,我认为使用最紧凑的表示更有可能是有益的。但测试和测量是决定的唯一决定性方法。

    实际上,获取顶点数据是管道中的主要瓶颈是相当罕见的。它确实发生了,但它并不常见。所以你无法衡量差异就不足为奇了。

    例如,在很多用例中,纹理数据总体上比顶点数据大得多。如果是这种情况,纹理采样所消耗的带宽通常比顶点提取所使用的带宽要重要得多。此外,与此相关的是,除了顶点之外,还有更多的片段,因此与片段处理相关的任何内容都比顶点处理更具性能要求。

    除此之外,许多应用程序进行了太多的OpenGL API调用,或者以低效的方式使用API​​,最终受到CPU开销的限制,特别是在非常高性能的GPU上。如果您正在优化现有应用程序的性能,那么您首先要检查的是:了解您是CPU还是GPU受限。