Двойная буфферизация своими руками?

аватар: POZiTRON
Звание: Энтузиаст
Сообщений: 278

Приветствую! Каким образом осуществляется двойная буфферизация? мне нужно отрисовывать достаточное количество объектов, простейшие эффекты и анимацию:
engine<>bitmap<>image

И как вообще:
1) Рисовать в отдельном потоке - вылазит постоянно out of system resources и другие ошибки
2) Что рисует быстрее всего? GDI, GDI+, Direct2D или использование Directx/OpenGL?

аватар: DirectoriX
Звание: Мастер
Сообщений: 1278

POZiTRON написал(а):

Каким образом осуществляется двойная буфферизация?

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

2 - Direct2D формально входит в состав DirectX. Только вот Direct2D практически не применяется (по крайней мере в играх) - либо картинка трёхмерная, либо рисуется с помощью других, более полезных библиотек (типа SDL, которая помимо графики ещё может обрабатывать ввод, звук, сеть). Быстрее всего - DirectX или OpenGL, зависит от прямоты рук и видеокарты. + надо смотреть, требуется ли взаимодействие с пользователем средствами самой библиотеки. Если да - я бы посоветовал SDL (тем более что она может явно использовать OpenGL).

Насчёт нескольких потоков: насколько я знаю, большинство программ и игровых движков непосредственно рисуют (т.е. комбинируют текстурки и проекции моделек на экран) в одном-единственном потоке, а в остальных обрабатывают логику и, возможно, динамические текстуры, размещённые в общей памяти. Всё из-за того, что отрисовкой (в смысле перекрашиванием пикселей) в проектах реального времени занимается видеокарта, а если можно подождать - то можно и подождать Smile Но это не точно.