forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Flip (http://forum.boolean.name/showthread.php?t=14880)

Hagrael 11.06.2011 16:24

Flip
 
Здравствуйте, уважаемые программисты. Я не понимаю, каким образом работает оператор Flip. В справке сказано, что он меняет местами BackBuffer() и FrontBuffer(), но тогда выходит, что в BackBuffer() идет то, что было раньше (происходит шаг назад!). Т. е. если до применения команды Flip FrontBuffer() находится на стадии I, то BackBuffer() находится на стадии II (т. к. в нем уже произошли изменения); после команды Flip BackBuffer() и FrontBuffer() обменялись своим местом в ОЗУ, и FrontBuffer() получил стадию II, а BackBuffer() стадию I, т. е. забыл о тех изменениях, которые с ним произошли до команды Flip. По-моему, я что-то не так понимаю. Буду признателен, если вы объясните.

Taugeshtu 11.06.2011 16:55

Ответ: Flip
 
Всё просто.

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


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

Hagrael 12.06.2011 12:04

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

Graphics3D 640, 480

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

WaitKey()

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

Graphics3D 640, 480

Print GraphicsBuffer()
Print BackBuffer()

WaitKey()

выдает два одинаковых числа.

Nerd 12.06.2011 12:47

Ответ: Flip
 
Цитата:

по умолчанию включен BackBuffer()?
Если Graphics3d - да, если просто Graphics - нет.
Цитата:

Содержание буфера - это готовая картина в пикселях или же сборище неотрендеренных моделей?
Готовая картина в пикселях.
Цитата:

у программы есть один скоп моделей и двойная буферизация сделана для того, чтобы не рендерились модели на глазах у игрока. Все так?
Буффер - это просто банк памяти представляющий собой растровую картинку, blitz3d даёт этот банк средствам directx, а на выходе получает прорисованые("отрендереные") модели, которые можно выводить на экран(меняя местами Back и Front буфферы, ибо вырисовывать на экран всё сразу было бы медленно).
Цитата:

Это, что, адрес в памяти?
Почти. Это хэндлом называется.

Hagrael 12.06.2011 13:33

Ответ: Flip
 
Большое спасибо!
Но один вопрос все-таки остался:
Код:

Graphics3D 640, 480

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

WaitKey()

выдает одну строчку цифр. А почему не две?

SBJoker 12.06.2011 14:08

Ответ: Flip
 
Потому что Graphics3D самостоятельно создаёт BackBuffer.

Taugeshtu 12.06.2011 15:24

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

Вообще, полезнее было бы сделать Print "1" и Print "2" - так хоть понятно, какая строка выводится)

Hagrael 12.06.2011 15:38

Ответ: Flip
 
Сейчас я вообще запутался. Почему такое:
Код:

Graphics3D 640, 480
Print "abc"
; RenderWorld : Flip
WaitKey()

что с Flip, что без, что с RenderWorld, что без него, не уберает текст?

baton4ik 12.06.2011 15:41

Ответ: Flip
 
Почему оно должно его убирать? Ты пишешь текст в BackBuffer, командой Flip меняешь буферы местами и текст отрисовывается.

Hagrael 12.06.2011 16:18

Ответ: Flip
 
Дело в том, что текст всегда на экране (не зависимо от того, буду я применять после команды Print команду Flip или нет).

SBJoker 12.06.2011 16:23

Ответ: Flip
 
А ты после флип стирай буфер через CLS

Hagrael 12.06.2011 17:24

Ответ: Flip
 
Нет, вы не поняли. Вначале стоит BackBuffer(). Я на нем печатаю какую-то строчку. И эта строчка появляется на экране! Значит, команда Print всегда печатает на FrontBuffer()?

impersonalis 12.06.2011 17:32

Ответ: Flip
 
Цитата:

Сообщение от Hagrael (Сообщение 191307)
Нет, вы не поняли. Вначале стоит BackBuffer(). Я на нем печатаю какую-то строчку. И эта строчка появляется на экране! Значит, команда Print всегда печатает на FrontBuffer()?

ДА.
Эти команды (принт\инпут) удобны для работы без буфферизации. Всё выводя сразу во фронт без всяких флипов.
//радует как человек дотошно разбирается в деталях - все бы так.

Hagrael 12.06.2011 18:13

Ответ: Flip
 
Спасибо! Я, кстати, так понимаю, что Print нужен исключительно при "DOS-оформлении" программы, т. к. когда я работал с 3-хмерными объектами, то при использовании Print экран просто скакал. Этот эффект никак не убрать? Если так, то как я понимаю, в 3D-игре нужно использовать оператор Text. Так, да?

impersonalis 12.06.2011 21:34

Ответ: Flip
 
Да. В более-менее дружественном интерфейсе принту не место.
Позицию вывода (в строках и пунктах(?)) для print\input можно задать оператором locate - но это всё не то.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot