Memset с шагом

С OpenGL во многих случаях для повышения эффективности необходимо увеличить скорость работы с данными. например, структура памяти будет такой: вершинный цвет-нормальный-вершинный-цвет-нормальный и т. д.

Есть ли какой-нибудь жизнеспособный вариант изменения, скажем, только цветового участка памяти с каким-то вариантом memset (то есть без использования цикла).

Также возникает вопрос, существует ли такая вещь, как циклический мемсет? Например, в массиве цветов, состоящем из четырех чисел с плавающей запятой, установите для всех них определенный цвет.


person kamziro    schedule 28.02.2011    source источник


Ответы (2)


Просто используйте петлю. В memset нет ничего волшебного, внутри он просто использует цикл, он может быть немного оптимизирован для одних и тех же компиляторов, чтобы очищать 64 бита за раз, если используется с 0, но он не устанавливает блок памяти в одной инструкции

person Martin Beckett    schedule 28.02.2011
comment
+1, глупый цикл for, который делает то же самое, займет примерно столько же времени. - person zneak; 28.02.2011
comment
это не всегда верно, некоторые компиляторы используют REP STOS, это одна инструкция, хотя внутри она выполняет цикл. - person Necrolis; 28.02.2011
comment
Хорошо, но память не очищается за один такт какой-либо аппаратной операцией в архитектуре памяти. - person Martin Beckett; 28.02.2011

Я бы просто пошел с петлей. Функция memset() делает небольшие аккуратные оптимизации для записи нескольких байтов за итерацию, так что вы можете посмотреть, как работает сама функция memset(), и посмотреть, применимы ли такие оптимизации к вашему коду. Но, в конце концов, это просто петля.

Вот memset() исходный код - довольно читабелен, хотя вам придется выкопать все typedef и макросы, чтобы увидеть, как именно происходит оптимизация.

person poundifdef    schedule 28.02.2011
comment
Нет исходного кода; однако есть реализация функции. - person GManNickG; 28.02.2011