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) --------------------------------------------- Возможно кому-то поможет. Мерцания были из-за частой смены буферов. Имеет смысл сначала отобразить все объекты сцены, и лишь потом обновить буфер.
|
|
| |
|