【问题标题】:GLES2.0 glVertexAttribPointer: Performance penalty for using odd Stride and Offset values?GLES2.0 glVertexAttribPointer:使用奇数步幅和偏移值的性能损失?
【发布时间】:2017-03-22 10:33:24
【问题描述】:

我有一些打包的顶点数据,每个顶点运行到 6 个字节:

glVertexAttribPointer Shader.pos3d_loc, 3, GL_UNSIGNED_BYTE, True, 6, 0
glVertexAttribPointer Shader.norm_loc, 3, GL_UNSIGNED_BYTE, True, 6, 3

使用不是 4 字节的倍数的步幅和偏移量是否会导致任何性能损失(例如隐藏的内存副本)?

【问题讨论】:

  • 此时没有复制。您要么将数据复制到顶点缓冲区,要么根据需要逐一访问这些值。这里的这些值只是告诉 OpenGL 如何解释你的缓冲区。例如 normal[i].x = (float)((ubyte)(((void*)ptr)[stride*i])) 其中 ubyte 来自 GL_UNSIGNED_BYTE 参数。
  • 谢谢 :) 我了解该函数的作用,但我知道有一些与对齐和格式相关的陷阱,其中 GL 会在内部默默地转换数据,但会付出巨大的性能代价。我想知道指定一个奇怪的步幅和对齐是否会促使 GL 在最终渲染调用发生时在内部重新缓冲数据。

标签: performance opengl-es-2.0 stride


【解决方案1】:

简短的回答是“视情况而定”:

在 PC 和(至少某些)Android 设备上,以这种方式紧密封装 3 组件属性没有明显的损失。

在 IOS 上(在撰写本文时,无论如何)存在很大的性能损失。 IOS GL 实现在内部解包并对齐任何非 4 字节对齐的属性,从而导致内存和 CPU 命中。除非您使用动态 VBO,否则 CPU 命中可能并不明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多