Просмотр полной версии : Вопрос писателям эмулей по графике
ILoveSpeccy
30.09.2012, 20:03
Привет всем,
есть вопрос к эмуляторописателям:
как быстро и красиво вывести картинку/звук на экран?
Пока знаком только с SDL. В принципе работает нормально, но хотел сделать интерфейс, схожий со спектакулятором.
В принципе интересуют 2 подхода: нативный win32 и кроссплатформенный.
Кто как это делает???
С уважением,
Дима
В принципе интересуют 2 подхода: нативный win32 и кроссплатформенный.
Кто как это делает???
В Win32-версии использовал VfW. Для чистого блиттинга нормально.
В принципе интересуют 2 подхода: нативный win32 и кроссплатформенный.
Кто как это делает???
Я для видео пользую DirectDraw (хотя это уже устарело), а конкретнее BitBlit.
А для аудио DirectSound.
Правда, пока что никто на кодеровских форумах не смог мне внятно подсказать метода ожидания начала кадра (VBlank) посредством либо засыпания процесса, либо же чтобы по VBlank'у устанавливался какой-нить семафор, вызывался бы колбек и т.д. Нашел только метод WaitForVerticalBlank, но он неэкономичный, т.к. процесс при этом не засыпает. Буду тоже признателен, если кто-нить подскажет, т.к. я не виндусятный кодер, и не очень ориентируюсь.
ILoveSpeccy
30.09.2012, 21:10
А для чего ждать начала кадра?
А для чего ждать начала кадра?
Это для того, если хочешь, чтобы изображение на экране менялось синхронно с кадровой разверткой. В иных случаях о плавности можно забыть.
ILoveSpeccy
30.09.2012, 21:21
Странно, я таких проблем не замечал. Как уже писал, использую SDL и DoubleBuffering вывод. Всё очень плавно.
В принципе интересуют 2 подхода: нативный win32 и кроссплатформенный.
А в чем суть каждого подхода?
Странно, я таких проблем не замечал. Как уже писал, использую SDL и DoubleBuffering вывод. Всё очень плавно.
Как происходит синхронизация с кадром? Или со временем?
ILoveSpeccy
30.09.2012, 22:16
А в чем суть каждого подхода?
Вообще изначально планировался кроссплатформенный эмуль.
Таким он сейчас и является. Собирается и работает на Win32/Ubuntu.
Интерфейса как такового только нет. Есть только простенькое меню
(через bitmap-шрифт) для выбора образа диска. и всё.
Мне очень нравится интерфейс спектакулятора. Было бы идеально
иметь похожий. Чтобы остаться кросплатформенным думал использовать
WxWidgets. Даже немного пробовал простенькие формы с кнопочками
делать. Проблема в том, что у меня не получается прилепить окошко SDL
к Win32 форме. В идеале должен быть доступ к меню из полноэкранного
режима.
---------- Post added at 20:16 ---------- Previous post was at 20:14 ----------
Как происходит синхронизация с кадром? Или со временем?
Я сделал так: запустил таймер на 20мс. Выполнил нужное количество тактов, вывел картинку и засыпаю до прерывания от таймера. Всё. Как я понял, SDL при использовании DoubleBuffering сама заботится о "плавности".
Я сделал так: запустил таймер на 20мс. Выполнил нужное количество тактов, вывел картинку и засыпаю до прерывания от таймера. Всё. Как я понял, SDL при использовании DoubleBuffering сама заботится о "плавности".
Нет, о плавности она не заботится, а максимум о синхронности вывода закадрового буфера по VBlank'у. Т.е. что изображение не попадает 'под лучик'.
Плавность видеовывода достигается только при синхронности с кадровой разверткой монитора. Т.е. если у монитора 60Гц, то обновлять изображение надо не раз в 20мс, а раз в 16.6мс, причем не по таймеру, а строго синхронно с VBlank.
Вообще изначально планировался кроссплатформенный эмуль.
Таким он сейчас и является. Собирается и работает на Win32/Ubuntu.
Я про "win32 подход". Звучит как рисование кадра через winapi функции и вывод звука в них же.
Если ты будешь ренедрить кадр и звук в буферы, то вывод их будет всего лишь вариантами работы под конкретные платформы.
не смог мне внятно подсказать метода ожидания начала кадра
Ожидание до прорисовки экрана (аналог спектрумовского HALT)
asm
mov dx,3dah;
@wait:
in al,dx;
test al,8;
jz @wait;
end;
Или я не про то?
Или я не про то?
В ДОСе такое работало, а вот в винде - нет. Я уже не говорю про другие ОС:)
Ожидание до прорисовки экрана (аналог спектрумовского HALT)
Витамин уже ответил.
Нужен виндовс-дружественный и многозадачно-дружественный способ. Тот, что у меня - отбирает лишнее время на контроль за лучом, а как я хотел бы сделать, но пока не нашел - читайте выше.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot