Как оптимизировать рисование в пикселях в SDL?

В последние дни я возился с C ++, и я пытаюсь понять, как рисовать пиксель экрана по каждому кадру.

Сначала это звучало довольно просто, но потом я понял, что для циклов во время основной петли игр нет ничего, кроме медленного беспорядка. Как безопасно и со скоростью показывать визуальные эффекты?

5 голосов | спросил ucleslus 17 MarpmTue, 17 Mar 2015 19:25:02 +03002015-03-17T19:25:02+03:0007 2015, 19:25:02

1 ответ


5

Операции визуализации на пикселях не особенно эффективны для современного оборудования. В прошлом, на классических игровых консолях и старых ПК, они могли быть полезными эффективно, потому что у вас был прямой доступ к видеопамяти. На современных машинах это уже не так.

Следовательно, если вы хотите эффективно обрабатывать пиксельные манипуляции, вам лучше построить свой собственный буфер памяти данных пикселя (что-то простое, как char *, указывающий на буфер байтов 4 * width * height, предполагая, что вы хотите четырехкомпонентные пиксели RGBA) и непосредственно манипулируете что.

В конце каждого кадра вы затем используете современный эффективный метод отображения этого буфера на экран. Обычно эти дни включают обновление текстуры графического процессора с помощью пиксельного буфера и рендеринг полноэкранного квадрата с соответствующей текстурой.

Кроме того, при фактическом манипулировании пикселями лучше не фактически устанавливать каждый пиксель отдельно, если это возможно. Большую часть времени вы будете отображать объекты, состоящие из более чем одного пикселя, и в этих случаях вы должны использовать специализированные процедуры для сглаживания данных. Сосредоточьтесь на доступе к памяти целевого буфера (и исходного буфера, если вы копируете спрайт) в кеш-когерентном режиме. Скопируйте целые строки данных, когда это возможно (для непрозрачных спрайтов вы можете memcpy строки спрайта).

Другой метод, обычно используемый при выполнении такого рода вещей, заключается в использовании «грязных прямоугольников», т. е. отслеживании областей, которые были изменены, и только повторного рендеринга (предыдущие рамки кадра спрайта, текущие рамки кадра sprite, например, или их объединение, если они перекрываются, как они обычно будут). Это, как правило, также включает в себя сохранение отдельного буфера, содержащего все статические фоновые изображения в сцене, поэтому вы можете (для каждого грязного прямоугольника) разбить соответствующую часть фона в прямоугольник, а затем сделать соответствующий чертеж переднего плана.

ответил Josh 17 MarpmTue, 17 Mar 2015 19:35:15 +03002015-03-17T19:35:15+03:0007 2015, 19:35:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132