Как быстро стереть огромный блок видеопамяти в 32-битной сборке - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь сделать свой собственный простой движок 3D-рендеринга в сборке полностью с нуля. Так что я запускаю его из DOS, переключаюсь на 32-битный PM и все такое прочее ....

Наконец-то я получил рабочие преобразования с проекцией и рендерингом каркаса, но у меня появилась действительно тривиальная проблема. После рендеринга моей сцены необходимо очистить LFB, чтобы в следующем кадре я мог рисовать там снова.

Но использование rep stosd или простого mov-loop цикла очень медленно, и мой FPS падает буквально до 10 с 60+.

Я использую высокое разрешение 1280x1024 пикселей с 4 байтами на пиксель, поэтому мне нужно установить 1280 * 1024 = 1310720 dwords = 5242880 байтов в ноль, начиная с адреса 0xFC000000.

Есть ли способ заставить память мгновенно стереть себя? (Я хочу сохранить эту резолюцию)

1 Ответ

0 голосов
/ 16 мая 2019

Если у вас есть только SSE, вы можете использовать pxor с movntps для выполнения 16 байтов за раз.Если у вас есть доступный SSE2, вы можете одновременно делать 16 байтов с pxor и movdqu (или более быстрым movdqa, если выровнены по 16 байтов).Если доступны инструкции AVX512, вы также можете использовать vpxor с регистром xmm и movntps с соответствующими регистрами zmm для выполнения 64 байтов.

Если вы хотите использовать инструкции SSE и / или AVX512, вам необходимо установить некоторые регистры управления :

mov eax, cr0
and ax, 0xFFFB      ;clear coprocessor emulation CR0.EM
or ax, 0x2          ;set coprocessor monitoring  CR0.MP
mov cr0, eax
mov eax, cr4
or ax, 3 << 9       ;set CR4.OSFXSR and CR4.OSXMMEXCPT at the same time
mov cr4, eax
...