Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 11.06.2011, 16:24   #1
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Сообщение Flip

Здравствуйте, уважаемые программисты. Я не понимаю, каким образом работает оператор Flip. В справке сказано, что он меняет местами BackBuffer() и FrontBuffer(), но тогда выходит, что в BackBuffer() идет то, что было раньше (происходит шаг назад!). Т. е. если до применения команды Flip FrontBuffer() находится на стадии I, то BackBuffer() находится на стадии II (т. к. в нем уже произошли изменения); после команды Flip BackBuffer() и FrontBuffer() обменялись своим местом в ОЗУ, и FrontBuffer() получил стадию II, а BackBuffer() стадию I, т. е. забыл о тех изменениях, которые с ним произошли до команды Flip. По-моему, я что-то не так понимаю. Буду признателен, если вы объясните.
(Offline)
 
Ответить с цитированием
Старый 11.06.2011, 16:55   #2
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Flip

Всё просто.

Представь, что у тебя есть картина. У неё две стороны.
Что можно делать:
Можно рисовать картину прямо перед лицом у зрителя - это одиночная буфферизация (не знаю правильный термин к сожалению)
А можно рисовать картину с задней стороны, а потом переворачивать, чтобы зрители вкушали картину, пока ты рисуешь следующий кадр на ставшей оборотной стороне.
Так вот:
Рисуешь картину ты с помощью RenderWorld и 2д-функций, и потом показываешь её с помощью Flip().


Иначе:
В FrontBuffer находится то, что увидит игрок.
В BackBuffer происходит отрисовка.
Чтобы показать игроку то, что мы нарисовали (когда мы уже закончили рисовать, есессно), мы использует Flip().
Я не в курсе, меняет ли б3д адресацию буферов или копирует содержимое Backbuffer в Frontbuffer (логично делать первое, но хрен его знает, что там Марк нахимичил), но это решительно ничего не меняет с точки зрения кода. Даже если в BackBuffer попадает содержимое FrontBuffer-а предыдущего кадра - всё равно задний буфер в 99% случаев (цифра с потолка, но близкая) перерисовывается полностью.
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.

Последний раз редактировалось Taugeshtu, 11.06.2011 в 16:58. Причина: уточнение
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
Dzirt (13.06.2011), Hagrael (14.06.2011), HolyDel (11.06.2011), Mr_F_ (12.06.2011)
Старый 12.06.2011, 12:04   #3
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Flip

Спасибо за хорошее объяснение, но не могли бы вы устранить один вопрос:
Содержание буфера - это готовая картина в пикселях или же сборище неотрендеренных моделей?
Если это пиксели, то все понятно: у программы есть один скоп моделей и двойная буферизация сделана для того, чтобы не рендерились модели на глазах у игрока. Все так?
И еще почему-то такой код:
Graphics3D 640, 480

Print GraphicsBuffer()
SetBuffer BackBuffer()
Print GraphicsBuffer()
Flip

WaitKey()
выдает только одно число (и что это за число? Когда я говорю Print anyModel, где anyModel - это какая-то модель, то тоже выдается число! Это, что, адрес в памяти?).
Извините за море вопросов, но тут нагрянул еще один: по умолчанию включен BackBuffer()?
Вот такой код:
Graphics3D 640, 480

Print GraphicsBuffer()
Print BackBuffer()

WaitKey()
выдает два одинаковых числа.
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 12:47   #4
Nerd
Чудо-кот
 
Аватар для Nerd
 
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений
(для 1,471 пользователей)
Ответ: Flip

по умолчанию включен BackBuffer()?
Если Graphics3d - да, если просто Graphics - нет.
Содержание буфера - это готовая картина в пикселях или же сборище неотрендеренных моделей?
Готовая картина в пикселях.
у программы есть один скоп моделей и двойная буферизация сделана для того, чтобы не рендерились модели на глазах у игрока. Все так?
Буффер - это просто банк памяти представляющий собой растровую картинку, blitz3d даёт этот банк средствам directx, а на выходе получает прорисованые("отрендереные") модели, которые можно выводить на экран(меняя местами Back и Front буфферы, ибо вырисовывать на экран всё сразу было бы медленно).
Это, что, адрес в памяти?
Почти. Это хэндлом называется.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hagrael (14.06.2011)
Старый 12.06.2011, 13:33   #5
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Flip

Большое спасибо!
Но один вопрос все-таки остался:
Graphics3D 640, 480

Print GraphicsBuffer()
SetBuffer BackBuffer()
Print GraphicsBuffer()
Flip

WaitKey()
выдает одну строчку цифр. А почему не две?
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 14:08   #6
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Flip

Потому что Graphics3D самостоятельно создаёт BackBuffer.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hagrael (14.06.2011)
Старый 12.06.2011, 15:24   #7
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Flip

Ещё может статься, что SetBuffer повторно инициализирует задний буфер, делая его пустым, а т.к. до Flip-а он на экран не попал - то, что в него поместили перед SetBuffer утрачено.

Вообще, полезнее было бы сделать Print "1" и Print "2" - так хоть понятно, какая строка выводится)
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 15:38   #8
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Flip

Сейчас я вообще запутался. Почему такое:
Graphics3D 640, 480
Print "abc"
; RenderWorld : Flip
WaitKey()
что с Flip, что без, что с RenderWorld, что без него, не уберает текст?
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 15:41   #9
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Flip

Почему оно должно его убирать? Ты пишешь текст в BackBuffer, командой Flip меняешь буферы местами и текст отрисовывается.
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 16:18   #10
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Flip

Дело в том, что текст всегда на экране (не зависимо от того, буду я применять после команды Print команду Flip или нет).
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 16:23   #11
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Flip

А ты после флип стирай буфер через CLS
__________________
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 17:24   #12
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Flip

Нет, вы не поняли. Вначале стоит BackBuffer(). Я на нем печатаю какую-то строчку. И эта строчка появляется на экране! Значит, команда Print всегда печатает на FrontBuffer()?
(Offline)
 
Ответить с цитированием
Старый 12.06.2011, 17:32   #13
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Flip

Сообщение от Hagrael Посмотреть сообщение
Нет, вы не поняли. Вначале стоит BackBuffer(). Я на нем печатаю какую-то строчку. И эта строчка появляется на экране! Значит, команда Print всегда печатает на FrontBuffer()?
ДА.
Эти команды (принт\инпут) удобны для работы без буфферизации. Всё выводя сразу во фронт без всяких флипов.
//радует как человек дотошно разбирается в деталях - все бы так.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
baton4ik (12.06.2011), Hagrael (14.06.2011), Randomize (13.06.2011), St_AnGer (12.06.2011)
Старый 12.06.2011, 18:13   #14
Hagrael
Нуждающийся
 
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений
(для 7 пользователей)
Ответ: Flip

Спасибо! Я, кстати, так понимаю, что Print нужен исключительно при "DOS-оформлении" программы, т. к. когда я работал с 3-хмерными объектами, то при использовании Print экран просто скакал. Этот эффект никак не убрать? Если так, то как я понимаю, в 3D-игре нужно использовать оператор Text. Так, да?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (12.06.2011)
Старый 12.06.2011, 21:34   #15
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Flip

Да. В более-менее дружественном интерфейсе принту не место.
Позицию вывода (в строках и пунктах(?)) для print\input можно задать оператором locate - но это всё не то.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Hagrael (14.06.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 05:58.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com