Среда, 13 Ноября 2024, 12:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
SDL+OpenGl двойная буферизация
MorfayДата: Пятница, 23 Марта 2012, 13:05 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Добрый день. Осваиваю SDL. Азы освоены, перешел к более сложному, а именно - проигрывание анимации с помощью SDL и OpenGL.
Как это происходит:
1) Загружаю спрайт.
2) Переношу часть спрайта (необходимый кадр) в текстуру.
3) Отображаю
и т. д.

Собственно, проблема в чем: во время проигрывания анимации мерцает задний фон. Сама анимация проигрывается без мерцания. Использую двойную буферизацию. Подозреваю, что на "невидимом" буфере рисуется кадр анимации, а задник остается на видимом, вот при смене он и мерцает. Но как тогда стоит сделать? При каждом воспроизведении анимации (фактически в любой анимации), отображать задник перед отображением кадра? Не будет ли это слишком накладно? Прошу помощи у более опытных - подскажите как лучше и правильнее строить сцену перед отображением. И как устранить мерцание задника.
BASSДата: Пятница, 23 Марта 2012, 15:02 | Сообщение # 2
independent developer
Сейчас нет на сайте
Попробуйте фон перерисовывать в каждом кадре - это программу практически не замедлит, даже с монобуферизацией.

Добавлено (23.03.2012, 15:02)
---------------------------------------------
В моей программе при ограничении в 30 PFS нагрузка на процессор ~3% даже при перерисовке задника.


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
MorfayДата: Пятница, 23 Марта 2012, 15:58 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Возможно вы правы. Но возникнет другая проблема - задний фон перекроет другие объекты. Впрочем и она решаема - как идея, сделать метод "RedrawScene", в котором будут перерисовываться все объекты по очереди, согласно приоритету (Сначала задник, потом статические объекты, типа бочек, ящиков и т.п., потом динамические объекты - персонажи). Так все объекты будут "накладываться" друг на друга в нужном порядке.
Мысль любопытная, но каждый раз перерисовывать все объекты - не слишком ли?
BASSДата: Пятница, 23 Марта 2012, 17:26 | Сообщение # 4
independent developer
Сейчас нет на сайте
Именно так я и делаю. По поводу скорости, как я уже сказал - никакого замедления не наблюдал.
Но у меня было всего 3 дин. объекта + 1 кнопка + фон, 640х480х8, один буфер, HardWare рендер.
Другого решения не вижу - когда используется blitting, "картинка" на surface необратимо изменяется, поэтому только покадровый ReDraw.
Я организовал так: вне главного цикла объекту Image присваивается текстура(=surface), а в цикле вызывается SetImage(Image_1), которая накладывает текстуру картинки на main_surface (задающий видеорежим).

Добавлено (23.03.2012, 17:26)
---------------------------------------------
А после такой отрисовки очищаю экран через SDL_FillRect( main_surface,nil, 0 ), это позволяет выводить объекты без фона.


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
MorfayДата: Пятница, 23 Марта 2012, 17:40 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Ок, уже набросал схемы классов (думаю сделать класс object в котором будут храниться все объекты. В зависимости от типа (background, static, dynamik, player) будет задаваться приоритет. А потом, при перерисовки сцены, будут отображаться согласно приоритету (сначала лепим бэкграунд, потом на него статические объекты, потом динамические (типа летящие облачка и прочее), а поверх всего отображаться персонажи)). В идеале получим построенную сцену, которую останется отобразить.

Есть еще вопрос, касательно изображения. Почему-то png отображается как сборище точек, повторяющие контуры персонажа (рисунок черно-белый). Этот же рисунок в jpg отображается нормально. Но вот прозрачности в jpg нет. Есть ли ограничения какие на png?
BASSДата: Пятница, 23 Марта 2012, 17:57 | Сообщение # 6
independent developer
Сейчас нет на сайте
Это Вы про SDL_image?
Просто, насколько я помню, SDL только BMP поддерживает.


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.
MorfayДата: Четверг, 19 Апреля 2012, 22:25 | Сообщение # 7
почетный гость
Сейчас нет на сайте
Да, SDL_image использую. Потом его же передаю в текстуру. Результат - отображаются либо точки по контуру фигуры, либо небольшие отрезки.

Добавлено (13.04.2012, 17:32)
---------------------------------------------
Итак, переписал. Получилось так как я хотел, тормозов не заметно (но возможно объектов мало). НО, иногда есть мерцание. При проверке ставлю анимацию на постоянное проигрывание, перерисовка идет отлично, но через 3-4 проигрывания анимация чуть мерцает. Потом опять нормально. Двойная буфферизация включена, от OpenGL избавился, количество кадров верное (3-4 раза анимация показывается же нормально). Вообще, что еще (кроме двойной буфферизации) влияет на прорисовку (имеется в виду настройки SDL, а не компа)?

Добавлено (19.04.2012, 22:25)
---------------------------------------------
Возможно кому-то поможет. Мерцания были из-за частой смены буферов. Имеет смысл сначала отобразить все объекты сцены, и лишь потом обновить буфер.

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг