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