OpenGL - выравнивание вершинных структур до 32-х байтов? - PullRequest
1 голос
/ 02 февраля 2011

Я читал, что некоторые графические карты выигрывают, если вы выровняете свои данные вершин в 32 байта.

Это обычно включает добавление отступов:

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

Но мне интересноЭто также означает, что вы должны выделить данные для выравнивания по 32 байта (malloc выравнивается по 1 байту)?То есть указатель на данные будет делиться равномерно на 32?Имеет ли это значение?

(я загружаю эти данные в VBO)

Спасибо

1 Ответ

7 голосов
/ 03 февраля 2011

Как правило, операция копирования из клиентской памяти в VBO может быть быстрее, если исходная память выровнена (обычно это место назначения).Это зависит от того, как вы выполняете загрузку в VBO.

Тем не менее, загрузка будет единственной вещью, которая будет усилена выравниванием.Как только память находится в VBO, имеет значение выравнивание памяти сервера VBO (которое вы не контролируете), которое имеет значение (реализации GL знают об этом, и они выравнивают память VBO).

О, и32 байта с заполнением 20 байтов просто не будут быстрее, чем 16 с заполнением 4 байта.Важно то, что у вас есть размер степени двойки, чтобы одна полная выборка вершин не перекрывала линии кеша.

Наконец, malloc не выравнивается в 1 байт.Он соответствует по крайней мере минимальному требованию выравнивания базовых типов, которое на большинстве платформ равно 8.

...