Я пытаюсь создать свой собственный простой движок 3D-рендеринга в сборке полностью с нуля. Итак, я запускаю его из DOS, переключаюсь на 32-битный PM и все такое...
Наконец-то я получил работающие преобразования с проекцией и каркасным рендерингом, но столкнулся с очень тривиальной проблемой. После рендеринга моей сцены LFB необходимо очистить, чтобы следующий кадр я мог снова нарисовать там.
Но использование цикла rep stosd
или простого цикла mov-loop
очень медленное, и мой FPS падает буквально до 10 с 60+.
Я использую высокое разрешение 1280x1024 пикселей с 4 байтами на пиксель, поэтому мне нужно установить 1280 * 1024 = 1310720 dwords = 5242880 байтов на ноль, начиная с адреса 0xFC000000.
Есть ли способ заставить память мгновенно стереть себя? (Я хочу сохранить это разрешение)
movnti
должен разрешать потоковые хранилища, которые выполняют пакетную передачу 64 байтов по шине PCIe (если у вас есть внешний графический процессор). Или, если вы можете использовать регистры XMM,movntps
для 16 байтов на инструкцию. Я думал, чтоrep stos
также будет эффективно работать с памятью WC, а вы говорите, что это медленно. Так что, возможно, ваша видеопамять настроена как некэшируемая, или я ошибаюсь насчетrep stosd
. - person Peter Cordes   schedule 15.05.2019CLZERO
x86. Но это всего 64 байта за раз, и на самом деле это не ускорит работу по сравнению с использованиемmovnt
хранилищ. Чтобы работать намного быстрее, вам нужно сообщить графическому процессору обнулить видеопамять, особенно если у вас есть дискретная графическая карта (а не iGPU, использующая ту же DRAM, что и ядра ЦП). Поэтому вам, возможно, придется писать драйверы графического процессора, а не просто сохранять их в памяти. - person Peter Cordes   schedule 16.05.2019