Какой самый быстрый способ повторно заполнить окно данными RGB из массива? - PullRequest
5 голосов
/ 08 ноября 2010

Я сейчас пишу простую игру. Мой графический код выполняется один раз за кадр (примерно 30 раз в секунду) и записывает данные RGB в массив с 640 * 480 = 307200 записей.

Я создал окно Win32 с клиентской областью размером 640 x 480 пикселей. Какой самый быстрый способ отобразить мои данные RGB в пустом окне?

Окно нужно будет обновлять каждый кадр, поэтому мне нужно избегать мерцания. Должен ли я использовать GDI для этого? Или есть более быстрый подход с использованием другой библиотеки - скажем, DirectDraw?

Edit:

Спасибо за все ответы. Во-первых, позвольте мне исключить Direct2D в качестве опции - мне нужно поддерживать Windows XP. Во-вторых, у меня есть фон в 3D, поэтому метод, предложенный Yann Ramin и Ben Voigtto - использование Direct3D / OpenGL и одного текстурированного квадрата - так я всегда делал в прошлом.

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

Я опубликовал свои результаты как часть этого дополнительного вопроса .

Ответы [ 4 ]

3 голосов
/ 08 ноября 2010

Лучшее, что вы можете сделать с помощью GDI, это использовать SetDIBitsToDevice, чтобы напрямую скопировать данные RGB из вашего массива в окно.Конечно, DirectX - это то, что нужно, если вам нужно полностью устранить мерцание.

1 голос
/ 08 ноября 2010

Использовать DirectDraw.У меня был полноэкранный Game of Life, который был узким местом при рисовании пикселей, когда я использовал GDI, и после перехода на DirectDraw я начал легко выкачивать 60 кадров в секунду.

1 голос
/ 08 ноября 2010

Функция GDI SetDIBitsToDevice будет работать нормально.

Текстурирование четырехугольника в соответствии с предложением theatrus также будет работать, за исключением того, что оно не должно быть полноэкранным, и OpenGL, безусловно, является наиболее переносимым вариантом, чтобы это произошло, см. glTexSubImage2D

Гораздо более прямой путь - glDrawPixels

В идеале, однако, ваш графический код будет использовать рендеринг с GPU-ускорением непосредственно в память GPU, тогда вам не нужно беспокоиться о перемещении битов из системной памяти в GPU.

1 голос
/ 08 ноября 2010

GDI абсолютно не подходит.

Лучший способ для кросс-оконной версии - использовать Direct3D и просто обновить текстуру на одном полноэкранном четырехугольнике.

Direct2D - это новый API (Win Vista с пакетом обновления и выше), который является предпочтительным механизмом, если вам не требуется поддержка XP. Direct2d ускоряет обработку шрифтов и других задач системного уровня.

...