【问题标题】:OpenGL - alignment of vertex structs to 32-bytes?OpenGL - 顶点结构对齐到 32 字节?
【发布时间】:2011-06-20 05:43:18
【问题描述】:

我了解到,如果您将顶点数据对齐为 32 字节,某些显卡会受益。

这通常涉及添加填充:

typedef struct {
  float x, y, z;
  int padding[5];
} Vertex;

但我一直在想,这是否也意味着您应该分配要对齐到 32 字节的数据(malloc 对齐到 1 字节)?这意味着指向数据的指针将平均分为 32?有关系吗?

(我正在将此数据上传到 VBO)

谢谢

【问题讨论】:

    标签: c opengl alignment padding vertex


    【解决方案1】:

    通常,如果源内存对齐(目标通常是),则从客户端内存到 VBO 的复制操作会更快。这在某种程度上取决于您如何上传到 VBO。

    也就是说,上传将是唯一会因对齐而得到提升的东西。一旦内存在 VBO 中,重要的是 VBO 服务器内存(您无法控制)的对齐(GL 实现知道这一点,并且它们确实对齐了 VBO 内存)。

    哦,20 字节填充的 32 字节不会比 4 字节填充的 16 字节快。重要的是你有一个 2 的幂大小,因此单个完整的顶点提取不会跨越缓存线。

    最后,malloc 不对齐到 1 个字节。它至少符合基本类型的最低对齐要求,在大多数平台上是 8。

    【讨论】:

    • 我想补充一点,您应该在您的平台上对差异进行基准测试。每个顶点 16 字节对于仅定位顶点可能是一个不错的选择,但也有可能未填充的数据(导致 3 个顶点适合 2 个缓存行而不是 2 个)可能更快且内存占用最少。
    • @rotoglup:没有什么比测量更好的了。但我见过 3 verts / 2 cachelines 较慢的实现,因为中间的顶点需要访问 2 个 cachelines。
    • 我当然也有,我想这完全取决于顶点的访问模式。如果以相对线性顺序访问它们,则性能影响可以忽略不计。这一切也要求性能瓶颈位于顶点访问:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多