Какой самый быстрый способ очистить блок памяти (или поверхность SDL)? - PullRequest
7 голосов
/ 21 декабря 2011

Я сейчас занимаюсь разработкой проекта с SDL.Он в основном рисует и перемещает изображения (поверхности) на экране.

Чтобы переместить изображение, не оставляя следа, сначала необходимо очистить поверхность экрана , почти как glClear (), иВ настоящее время я делаю это с помощью простого цикла for, перебирающего пиксели поверхности (также рисуя черный прямоугольник на поверхности или memset).

Хотя предыдущие решения отлично работают на небольших поверхностях, они становятся все медленнее, так какповерхность становится больше, поэтому я искал самый быстрый способ очистить (обнулить) блок памяти.

Кроме того, друг отметил, что использование SIMD-инструкций может сделать работу очень быстро, но в последний раз я 'Вы сделали ASM на 8085, любая информация по этому вопросу также может быть полезна.

Ответы [ 2 ]

15 голосов
/ 21 декабря 2011

Самый быстрый способ - использовать memset.

memset(ptr, 0, length);

Это автоматически использует SIMD на архитектурах, которые его поддерживают *. Вы не собираетесь победить это. Он уже связан с памятью, поэтому он записывает нули так быстро, как процессор может их выплюнуть. Я не знаю, кто сказал вам, что memset медленнее для больших блоков, но вы должны перестать слушать этого человека.

* Есть некоторые наборы инструментов, которые не дают вам быстрый memset. Маловероятно, что вы используете один.

3 голосов
/ 21 декабря 2011

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

...