|
2D-программирование Вопросы, касающиеся двумерного программирования |
11.06.2011, 16:24
|
#1
|
Нуждающийся
Регистрация: 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
|
scientist.alien
Регистрация: 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 за это полезное сообщение:
|
|
12.06.2011, 12:04
|
#3
|
Нуждающийся
Регистрация: 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
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Flip
по умолчанию включен BackBuffer()?
|
Если Graphics3d - да, если просто Graphics - нет.
Содержание буфера - это готовая картина в пикселях или же сборище неотрендеренных моделей?
|
Готовая картина в пикселях.
у программы есть один скоп моделей и двойная буферизация сделана для того, чтобы не рендерились модели на глазах у игрока. Все так?
|
Буффер - это просто банк памяти представляющий собой растровую картинку, blitz3d даёт этот банк средствам directx, а на выходе получает прорисованые("отрендереные") модели, которые можно выводить на экран(меняя местами Back и Front буфферы, ибо вырисовывать на экран всё сразу было бы медленно).
Это, что, адрес в памяти?
|
Почти. Это хэндлом называется.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.06.2011, 13:33
|
#5
|
Нуждающийся
Регистрация: 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
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Flip
Потому что Graphics3D самостоятельно создаёт BackBuffer.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.06.2011, 15:24
|
#7
|
scientist.alien
Регистрация: 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
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Flip
Сейчас я вообще запутался. Почему такое:
Graphics3D 640, 480
Print "abc"
; RenderWorld : Flip
WaitKey()
что с Flip, что без, что с RenderWorld, что без него, не уберает текст?
|
(Offline)
|
|
12.06.2011, 15:41
|
#9
|
Дэвелопер
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений (для 1,962 пользователей)
|
Ответ: Flip
Почему оно должно его убирать? Ты пишешь текст в BackBuffer, командой Flip меняешь буферы местами и текст отрисовывается.
|
(Offline)
|
|
12.06.2011, 16:18
|
#10
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Flip
Дело в том, что текст всегда на экране (не зависимо от того, буду я применять после команды Print команду Flip или нет).
|
(Offline)
|
|
12.06.2011, 16:23
|
#11
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Flip
А ты после флип стирай буфер через CLS
__________________
|
(Offline)
|
|
12.06.2011, 17:24
|
#12
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Flip
Нет, вы не поняли. Вначале стоит BackBuffer(). Я на нем печатаю какую-то строчку. И эта строчка появляется на экране! Значит, команда Print всегда печатает на FrontBuffer()?
|
(Offline)
|
|
12.06.2011, 17:32
|
#13
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Flip
Сообщение от Hagrael
Нет, вы не поняли. Вначале стоит BackBuffer(). Я на нем печатаю какую-то строчку. И эта строчка появляется на экране! Значит, команда Print всегда печатает на FrontBuffer()?
|
ДА.
Эти команды (принт\инпут) удобны для работы без буфферизации. Всё выводя сразу во фронт без всяких флипов.
//радует как человек дотошно разбирается в деталях - все бы так.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
12.06.2011, 18:13
|
#14
|
Нуждающийся
Регистрация: 11.06.2011
Сообщений: 57
Написано 6 полезных сообщений (для 7 пользователей)
|
Ответ: Flip
Спасибо! Я, кстати, так понимаю, что Print нужен исключительно при "DOS-оформлении" программы, т. к. когда я работал с 3-хмерными объектами, то при использовании Print экран просто скакал. Этот эффект никак не убрать? Если так, то как я понимаю, в 3D-игре нужно использовать оператор Text. Так, да?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.06.2011, 21:34
|
#15
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Flip
Да. В более-менее дружественном интерфейсе принту не место.
Позицию вывода (в строках и пунктах(?)) для print\input можно задать оператором locate - но это всё не то.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:58.
|