C # Двойная буферизация?

Я использую компилятор COSMOS для написания ОС на C # (для тех, кто не знает, что COSMOS преобразует код IL в сборку x86), и я делаю графический интерфейс.
Я делал GUI раньше, но теперь я пытаюсь сделать двойной буфер.
Это звучит довольно просто, но вот моя проблема -
Я не могу использовать какие-либо методы из System.Drawing библиотеки или любого другого пространства имен, которое использует p / invokes. Кроме того, я не могу использовать многомерные массивы (я МОГУ использовать обычные массивы). Итак, мой вопрос: как мне реализовать двойной буфер?
Я знаю, что это возможно, потому что я знаю кого-то, кто это сделал.

Кроме того, у меня есть только графические функции SetPixel, GetPixel и Clear. Все, хотя я предпочитаю ответ, если кто-нибудь знает хорошую статью о двойной буферизации и т. Д., Пожалуйста, скажите мне.
PS. Моя ОС в разрешении 320 x 200 LOL


person Grunt    schedule 30.07.2011    source источник


Ответы (3)


Вам нужно будет немного узнать историю игры DOS C VGA, похоже ;-)

См. Двойная буферизация, перелистывание страниц и режим без привязки. Применяются все те же концепции, но я не уверен, как они будут переведены в код C #.

Удачного кодирования.

person Community    schedule 30.07.2011
comment
Спасибо это именно то, что мне нужно - person Grunt; 30.07.2011

Попробуйте проверить, есть ли у вас доступ к System.Drawing.BufferedGraphics. Для этого он реализует методы. В противном случае, боюсь, вам придется делать это вручную.

Обычно, когда вы рисуете прямо на экране, пользователь видит то, что вы рисуете, в том виде, в каком оно нарисовано. Это как когда ты просишь Алекса нарисовать тебе яблоко; вы исследуете его, пока он рисует пером яблоко. Теперь, если вы попросите Алекса нарисовать красное яблоко, затем сотрите его, затем нарисуйте синее яблоко, затем сотрите его, затем нарисуйте желтое яблоко и т. Д. Вы будете смотреть на него, пока он стирает его каждый раз. Подумайте об этом так: компьютер - быстрый, Алекс. Поэтому, если вы попросите нарисовать быструю анимацию прямо на экране, пользователь отметит, что что-то происходит между кадрами анимации: плохое мерцание!

Решение проблемы мерцания - двойная буферизация. Буфер - это просто область памяти за пределами экрана, используемая для рисования. Когда вы используете двойную буферизацию, вместо рисования непосредственно на экране вы рисуете в задний буфер, расположенный в видеопамяти, а затем копируете весь буфер на экран.

person SiN    schedule 30.07.2011

Двойная буферизация может быть реализована путем использования массива для построения графика (в отличие от дисплея) и путем копирования массива (после завершения построения) на дисплей.

person Emond Erno    schedule 30.07.2011