2015-05-17 3 views
1

У меня есть приложение OpenGL с win32 api без перенасыщения и т. Д. ... и я столкнулся с проблемой разрыва экрана в полноэкранном режиме. Я установил WS_POPUP как стиль окна и разрешение моего монитора как размер окна. Я бегу на AMD Radeon HD 7770, и я вижу страшное разрывание! Когда я положил WS_POPUPWINDOW стиль вместо WS_POPUP, разрывание пропало, однако у меня есть нежелательная граница вокруг моей сцены. Еще одна вещь, которую я заметил, это факт, что разрывание исчезает, когда разрешение НЕ является родным. Итак, когда я передаю my_screen_resolution + 1 в качестве параметра размера, разрывание пропало.OpenGL разрывается с полноэкранным родным разрешением

RESx = 1920; 
RESy = 1080; 
hwnd = CreateWindowEx(NULL, NAME, NAME, WS_POPUP, 0, 0, RESx, RESy, NULL, NULL, hInstance, NULL); 
SetWindowPos(hwnd, 0, -1, -1, RESx + 1, RESy + 1, 0); // With this function call, the tearing disappears! 

Что я могу сделать, чтобы избавиться от разрывов без необходимости запускать на родном разрешении?

EDIT: (Подсказка: Это не V-Sync)

+0

Я не думаю, что вы можете избежать vsync, чтобы избавиться от разрыва. С другой стороны, существует множество потенциальных решений для ограничения входного запаздывания. Например, запустите свою логику приложения со скоростью 300 кадров в секунду, но нарисуйте ее только на 60 кадров в секунду. Попробуйте Google для получения дополнительной информации (или, возможно, задайте другой вопрос здесь). – Jerem

+0

Я обновляю вещи на 60FPS и максимально опираясь на максимум (я получаю около 600FPS). Я знаю, я могу избежать разрыва с последней функции («SetWindowPos (hwnd, 0, -1, -1, RESx + 1, RESy + 1, 0);') в моем сообщении делает это. Однако я считаю, что это не правильное решение. – ProXicT

+1

«Подсказка: это не V-синхронизация» ... ну, спасибо за подсказку, но на самом деле это V-синхронизация. Вся цель V-синхронизации заключается в предотвращении разрыва. Это все, что он делает. У V-sync нет других целей. –

ответ

2

Что я могу сделать, чтобы избавиться от разрыва без необходимости запускать на родном разрешении?

EDIT: (Подсказка: Это не V-Sync)

Да, это V-Sync.

Когда вы создаете полноэкранное окно, оно будет обходить компоновщик DWM.

Если окно не покрывает весь экран, его содержимое проходит через DWM-композитор. Сам компономер DWM сам делает копию содержимого окна всякий раз, когда что-то указывает, что это делается рисованием (возврат из обработчика WM_PAINT, EndPaint или SwapBuffers). Сама композиция имеет V-синхронизацию.

Спасибо за ваш совет, но я хочу aviod разрывать без vsync. С vsync у меня ужасное входное отставание.

Тогда вы делаете что-то неправильно в своей обработке ввода. Скорее всего, ваш цикл событий обрабатывает только одно входное событие, а затем выполняет перерисовку. Если это так, и сложность сцены возрастает, то вы получаете отставание, это пропорционально сложности рисования вашей сцены. Вы не хотите, чтобы это произошло.

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

+0

Спасибо! Теперь я понимаю. Я не знал о DWM-компоновщике, теперь это имеет смысл для меня. Спасибо за отличное объяснение! :-) – ProXicT

0

Чтобы удалить OpenGL слезотечение, вы должны иметь "включить" вертикальную синхронизацию. Перейдите по этой ссылке для получения более подробной информации: how to enable vertical sync in opengl?

+0

Спасибо за ваш совет, но я хочу aviod разрывать без vsync. С vsync у меня ужасное входное отставание. – ProXicT

+0

Очень вероятно, что, когда вы говорите, что «разрывание исчезает, когда разрешение не является родным», очень вероятно, что ваша видеокарта сможет коснуться 60 FPS, и если вы этого не сделаете, у вас будет что-то вроде 40-50, которое дает раздражающее разрывание. Я бы по-прежнему предлагал установить код интервала обмена и сделать приложение «lag aware». Некоторые компьютеры будут время от времени отставать при запуске приложения, поэтому лучше заранее подготовиться. –

+0

Нет, у меня около 600FPS – ProXicT

 Смежные вопросы

  • Нет связанных вопросов^_^