GLES2.0 glVertexAttribPointer: снижение производительности за использование нечетных значений Stride и Offset?

У меня есть некоторые упакованные данные вершин, которые работают до 6 байтов на вершину:

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

Существуют ли какие-либо потери производительности (например, скрытые копии памяти), вызванные использованием шагов и смещений, не кратных 4 байтам?

1 ответ

Краткий ответ "это зависит":

На ПК и (по крайней мере, на некоторых) устройствах Android не существует ощутимых штрафов за плотную упаковку трехкомпонентных атрибутов таким способом.

На IOS (во всяком случае, на момент написания этой статьи) существует большое снижение производительности. Реализация IOS GL внутренне распаковывает и выравнивает любые атрибуты, которые не выровнены по 4 байта, вызывая попадание в память и ЦП. Удар процессора может быть незаметным, если вы не работаете с динамическими VBO.

Другие вопросы по тегам