OpenGL - 顶点结构与 32 字节对齐?
我读到,如果将顶点数据对齐为 32 字节,某些显卡会受益。
这通常涉及添加填充:
typedef struct {
float x, y, z;
int padding[5];
} Vertex;
但我一直想知道,这是否也意味着您应该分配要对齐到 32 字节的数据(malloc 对齐到 1 字节)?意思是指向数据的指针会平均分为 32 份?有关系吗?
(我正在将此数据上传到VBO)
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通常,如果源内存对齐(目标内存通常也是对齐的),从客户端内存到 VBO 的复制操作会更快。这在某种程度上取决于您如何上传到 VBO。
也就是说,上传将是唯一因对齐而得到提升的事情。一旦内存位于 VBO 中,VBO 服务器内存的对齐(您无法控制)就很重要(GL 实现知道这一点,并且它们确实会对齐 VBO 内存)。
哦,带有 20 字节填充的 32 字节不会比带有 4 字节填充的 16 字节更快。重要的是你有一个二次方的大小,这样单个完整的顶点获取就不会跨越缓存行。
最后,malloc 不与 1 字节对齐。它至少符合基本类型的最低对齐要求,在大多数平台上为 8。
Typically, the copy operation from the client memory to the VBO can be faster if the source memory is aligned (the destination typically will be). It somewhat depends on how you do the upload to the VBO.
That said, the upload will be the only thing that gets boosted by the alignment. Once the memory is in the VBO, it's the alignment of the VBO server memory (that you don't control) that matters (GL implementations know this, and they do align the VBO memory).
Oh, and 32 bytes with 20 bytes padding is just not going to be faster than 16 with 4 bytes of padding. What matters is that you have a power-of-two size, so that a single complete vertex fetch does not straddle cachelines.
Last, malloc does not align to 1 byte. It aligns at least to the minimum alignment requirement of basic types, which on most platforms is 8.