Как синхронизировать перелистывание страниц с вертикальным возвратом в оконном приложении SDL? - PullRequest
5 голосов
/ 28 ноября 2010

В настоящее время я пишу игру огромной сложности и хитрости, которая наполнит вас благоговением и удивлением, хорошо, это 15 головоломок, и я просто знакомлюсь с SDL.

Я работаю в оконном режиме и использую SDL_Flip в качестве обновления страницы в общем случае, поскольку он автоматически сопоставляется с SDL_UpdateRect полного окна в оконном режиме. Не оптимальный подход, но, учитывая, что это всего лишь 15 головоломок ...

В любом случае, движения плитки происходят со смехотворной скоростью. Таким образом, SDL_Flip в оконном режиме не включает никакой синхронизации с вертикальными откатами. Я работаю в Windows XP ATM, но я предполагаю, что это правильное поведение для SDL и будет происходить и на других платформах.

Переход на использование SDL_UpdateRect, очевидно, ничего не изменит. Предположительно, мне нужно реализовать логику задержки в моем собственном коде. Но простой таймер на основе часов может привести к обновлениям, возникающим, когда окно наполовину прорисовано, что вызывает видимые искажения (я забыл техническое название).

РЕДАКТИРОВАТЬ Эта проблема известна как «разрыв».

Итак, как в игре с оконным режимом в SDL, как синхронизировать переворот с вертикальным возвратом?

РЕДАКТИРОВАТЬ При поиске решения я видел несколько заявлений о том, что невозможно синхронизировать перевороты страниц с вертикальным возвратом в оконном приложении. По крайней мере, в Windows это просто неверно - я написал игры (под которыми я имею в виду вещи, подобные уровню с 15 головоломками), которые делают это. Однажды я потратил впустую некоторое время, играя с Dark Basic и Dark GDK - и на основе DirectX, и на обоих, синхронизация страниц переворачивает на вертикальный откат в оконном режиме.

Ответы [ 2 ]

4 голосов
/ 28 ноября 2010

Major Edit

Оказывается, мне стоило больше времени искать, прежде чем спрашивать.Из часто задаваемых вопросов по SDL ...

http://sdl.beuc.net/sdl.wiki/FAQ_Double_Buffering_is_Tearing

Кажется, что это довольно сильно указывает на то, что синхронизация с вертикальным возвратом не поддерживается в приложениях оконного режима SDL.

Но ...

Базовая техника возможна в Windows , и я начинаю думать, что в некотором смысле это делает SDL.Просто пока не совсем уверен.

В Windows, как я уже говорил, синхронизация перелистывания страниц с вертикальной синхронизацией в оконном режиме была возможна вплоть до 16-битных дней с использованием WinG.Оказывается, это не совсем так, но вводит в заблуждение.Я выкопал некоторый старый исходный код, используя WinG, и был таймер, запускающий блики страниц.WinG будет работать с смехотворной скоростью, как меня удивило SDL - операции перелистывания страниц на экране не ждут вертикального отката.

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

Этот переход на экран в WinG, очевидно, аналогичен SDL_UpdateRect.SDL_UpdateRects - это просто оптимизированный способ ручного объединения некоторых грязных прямоугольников (и, возможно, они применяются к одному и тому же кадру).Так что, возможно (на платформах, где возможна вертикальная трассировка) это делается в SDL, аналогично WinG - без ожидания, но и без разрывов.

Что ж, я протестировал использование таймера для запуска обновления кадраи результат (на Windows XP) является неопределенным.Я мог получить очень слабые и случайные разрывы на моем древнем ноутбуке, но это может быть не вина SDL - возможно, что «растр» опережает блиц.Вероятно, это моя вина за использование SDL_Flip вместо прямого вызова SDL_UpdateRect с минимальным грязным прямоугольником - хотя я пытался разорвать в этом случае, чтобы посмотреть, смогу ли я.

Так что я все еще не уверен, но может быть так, что SDL оконного режима так же невосприимчив к разрыву, как и на тех платформах, которые позволяют это.Результаты не так плохи, как я себе представлял, даже на моем древнем ноутбуке.

Но - кто-нибудь может предложить окончательный ответ?

0 голосов
/ 27 января 2013

Вы можете использовать управление частотой кадров SDL_gfx .Глядя на библиотеку документы , поток вашего приложения будет выглядеть следующим образом:

// initialization code
FPSManager *fpsManager;
SDL_initFramerate(fpsManager);
SDL_setFramerate(fpsManager, 60 /* desired FPS */);


// in the render loop
SDL_framerateDelay(fpsManager);

Также вы можете посмотреть исходный код , чтобы создатьсобственный контроль частоты кадров.

...