2011-02-04 3 views
0

В игре наша сборная в Интернете - это программирование, мы предполагаем, что каждый из нашей аудитории будет иметь WAY за полночь в игре.Идеальная реализация V-sync для легковесной игры OpenGL: нужен один лакомый кусочек информации

Итак, чтобы сохранить видеопамять и, надеюсь, дать немного больше времени на графическую карту, использование V-синхронизации без двойной буферизации было бы нашим лучшим вариантом. Итак, в OpenGL нам нужно знать, как это сделать.

С моей точки зрения, V-sync - это когда графическая карта приостановлена, когда она была сделана, показывая один кадр, пока этот кадр не будет отправлен на устройство отображения. Двойная буферизация не приостанавливает операции рендеринга (или, может быть, делает это, или, может быть, специфична для реализации, не уверен), потому что вместо этого обращается к второму буфере перед копированием в фреймбуфер, так что монитор либо получает полный кадр, либо нет новый кадр (в частности, последнее сохраненное изображение в фреймбуфере). Ну, нам не нужна эта функция, пока графическая карта просто записывает в фреймбуфер ТОЛЬКО, когда это чертовски нужно.

Это довольно медленная онлайн-игра (но это ОЧЕНЬ творческий^_ ^). Очень мало действий в реальном времени. Поэтому чрезвычайно точная вводная информация пользователя не требуется; он может быть захвачен из ОС в виде отдельного блока в любое время перед визуализацией кадра.

Итак, для того, чтобы делать ТОЧНО это, мне нужно иметь возможность получить сообщение «Рамка закончила отправлять на монитор» из OpenGL. Является ли это возможным? Если нет, то какая из лучших альтернатив?

Игра в настоящее время запрограммирована для Windows, но в течение нескольких месяцев должна быть выполнена работа для Linux.

+0

Видеокарты предназначены для обеспечения достаточной памяти для двойной буферизации. Все игры там используют его. Кроме того, слои драйвера не дают вам прямого контроля над «при отправке кадра на монитор». В этом отношении готовы ли вы обрабатывать случаи с несколькими мониторами? вы готовы работать только в полноэкранном режиме? – Bahbar

ответ

8

Вы страдаете от заблуждения, что делает V-Sync. В видеопамяти есть часть, которая непрерывно отправляется на дисплейное устройство с постоянной скоростью, частотой обновления кадров. Поэтому сразу же после отправки полного кадра следующий кадр будет отправлен после очень короткого пробела. Но время между отправкой кадров намного короче, чем время, необходимое для отправки полного кадра.

Что происходит без V-Sync, так это то, что операции над содержимым фреймбуфера становятся видимыми, например, если кадр заполнен чередующимся с красным и зеленым цветом, и нет V-Sync, вы увидите красные и зеленые полосы на монитор. Чтобы избежать этого, V-Sync заменяет указатель, используемый драйвером дисплея для доступа к фреймбуферу сразу после отправки полного кадра.

Это подводит нас к тому, что делает двойной буферинг. Без двойного буферизации мало используется для V-Sync. Действие, инициированное V-Sync, должно происходить очень быстро. Таким образом, это сводится к замене указателя или очень быстрой операции blitting (возможно, просто установив атрибуты CoW для MMU GPU).

Без двойного буферизации и без V-Sync эффект заключается в том, что можно увидеть процесс, в котором изображение отображается по частям фреймбууру.Конечно, если рендеринг происходит быстрее, чем период кадра, это приводит к тому, что сверху вниз вы увидите только малонаселенное изображение с большим количеством контента, видимым в сторону бутылки, и где-то между ними он попадает в нижний край экрана, всплывая наверх. Линия пересечения будет двигаться.

TL; DR: Просто используйте двойную буферизацию и включите V-Sync для замены буфера. Не бойтесь потребления памяти. У всех графических процессоров, находящихся в обращении сегодня, более чем достаточно ОЗУ, чтобы легко обеспечить память для двухбуферных цветных плоскостей. Просто выполните математику: 1920x1200 * RGB = 6MiB, даже самые маленькие графические процессоры на ПК сегодня обеспечивают не менее 128 Мбайт ОЗУ. Мобильные устройства, скажем, iPad 1024 * 768 * RGB = 2MiB против 32MiB для графики. В любом случае, UI iPad будет двойным буфером.

+0

ОК, так как «время между отправкой кадров намного короче времени, необходимого для отправки полного кадра», что разрушает мою идею. : P Я не уверен, что понял бы это через простой Гуглинг. И 8 МБ звучит ОЧЕНЬ мало по сравнению со временем, которое мне вернулось. Понимаете, мне просто нужно было получить информацию, чтобы узнать еще один шаг в том, что правильно или неправильно. Благодарю. – daddesio

0

Вы можете использовать wglGetProcAddress, чтобы получить адрес wglSwapIntervalEXT, а затем позвонить wglSwapIntervalEXT(1); для синхронизации обновлений с помощью вертикальной синхронизации. Когда вы это сделаете, вы не получите сообщение при вертикальной синхронизации - вместо этого glFlush просто не вернется, пока не произойдет вертикальная обратная связь, и экран был обновлен. Таким образом, у вас есть WM_PAINT обработчик, который выглядит примерно так:

BeginPaint 
wglMakeCurrent 
do drawing 
glFlush 
EndPaint 

glFlush необходима в любом случае, чтобы обеспечить чертеж вы сделали отсылается на экран.

+0

Разрешение реализации OGL сделать паузу звучит более изящным и «предназначенным», но мне придется запускать его в отдельном потоке, чтобы захватить ввод. (Не проблема.) Кроме того, функция, на которую вы указали мне, использует отдельный буфер рисования, который не понадобился бы, если рендеринг был только что сделан в фреймбуффе сразу после того, как монитор его прочитал. Я надеюсь, что я не звучащим упрямым ищу конкретный ответ ... Так что, если никто не отвечает лучшим решением, то я пойду с вашим (й всем Интернетом, поскольку много Googling показали) предложение. Спасибо, Джерри. – daddesio

+0

О, эй! Сканирование по спецификациям OpenGL, я обнаружил, что есть glX-расширение glXWaitForMscOML, которое ждет MSC (счетчик медиапотоков), «счетчик, который уникален для графической подсистемы и увеличивает каждый вертикальный обратный отсчет». У меня есть крайние сомнения в том, что для WGL есть эквивалентная функция. Интересно, что это может обойти любую опцию «Force v-sync off», которую пользователь мог установить в своих графических настройках. Это заставляет меня чувствовать себя плохо: P, но в этом случае это определенно к лучшему. – daddesio

+0

@ ModChipV12: Если у вас были крайние сомнения, вы можете быть в крайнем счастье: http://www.opengl.org/registry/specs/OML/wgl_sync_control.txt –