Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Подлагивания и вертикальный разрыв изображения при рендеринге

Подлагивания и вертикальный разрыв изображения при рендеринге

Поделиться

Страницы: 1 2 Следующая

SuslikМодераторwww31 окт. 201716:48#0
Имеется велосипедный OpenGL рендер на контекст, созданный посредством sfml окна. sfml только создаёт окно и вызывает glSwapBuffers(), всё остальное — на мне. Так вот проблема заключается в том, что при запуске приложения окно разделяется на заметные зоны, разделённые вертикальной или горизонтальной линией. В одной полосе рендеринг осуществляется нормально, а в другой — изображение заметно подлагивает, очень нерегулярно, но фпс в одной половине окна может быть около сотни, а в другой — около 20, причём очень сильно скачет. Получается так, что изображение разрывается как при отключенном vsync'е, но не горизонтальной полосой, а иногда очень заметной вертикальной полосой. Особенно интересным является то, что этот эффект явно связан с чем-то ещё вне моего приложения, потому что иногда он проявляется сильнее, иногда — слабее. Например, если в браузере на бэграунде играет youtube-видео, то полоса разделения лагучей и нормальной областей находится примерно в 120 пикселях от левого края окна. Если видео поставить на паузу, то весь контекст становится лагучим. Если вытянуть окно вижуал студии поверх остальных, то полоса становится горизонтальной. Короче, я не нашёл особой закономерности, но точно могу сказать, что происходит что-то нечистое.

Важный момент — если изменить размер моего окна хоть на 1 пиксель во время работы(потянув за рамку), эффект полностью пропадает и рендеринг осуществляется во всём окне с нормальной сокростью около 100фпс. После повторного запуска проблема вновь воспроизводится.

Проблема явно воспроизводится не в любом opengl-контексте, так как я проверил несколько своих старых проэктов(используют старый opengl, не используют sfml), в них проблемы нет.

Вопрос: куда копать?

FuntikПостоялецwww31 окт. 201718:00#1
Suslik
Если ты используешь из sfml только окно, почему бы, для начала, не перевести это всё на glfw?
MrShoorУчастникwww31 окт. 201722:50#2
Suslik
> Вопрос: куда копать?
Хардварные оверлеи? Монитор подключен к одной видеокарте, а ренедришь ты на другой. Далее отрендереное изображение нужно по шине передать на вторую видеокарту для вывода на монитор. Но ютубчик на фоне начисто забивает шину/видеоадаптер подключенный к монитору. Как тебе такой вариант?
SuslikМодераторwww1 ноя. 20172:46#3
MrShoor
> Хардварные оверлеи? Монитор подключен к одной видеокарте, а ренедришь ты на
> другой. Далее отрендереное изображение нужно по шине передать на вторую
> видеокарту для вывода на монитор. Но ютубчик на фоне начисто забивает
> шину/видеоадаптер подключенный к монитору. Как тебе такой вариант?
да, забыл сказать, что дело происходит на ноуте со встроенным интелом и нормальной видюхой. так что что-то такое возможно. хотя само приложение 100% запущено на нвидии, я проверял.

Правка: 1 ноя. 2017 2:46

MrShoorУчастникwww1 ноя. 20172:57#4
Suslik
> на ноуте со встроенным интелом и нормальной видюхой
Ну экран ноута обычно к встроеной видеокарте подключен. Возьми GPU-Z и посмотри на загрузку встроенной видяхи когда ничего кроме твоего приложения не запущено. Должно быть процентов 5-7 нагрузки на встроенную.
А по сабжу - возможно кривые драйвера на материнку стоят.
SuslikМодераторwww1 ноя. 20172:59#5
у меня недавно венда переставилась. точнее, я её хотел обновить, а она себя переустановила. разумеется, все дрова слетели. я поставил дрова на нвидию руками, но, возможно, придётся заново дрова на чипсет поставить, хоть я это очень не люблю.
AndreyПостоялецwww1 ноя. 20178:57#6
Suslik
> Имеется велосипедный OpenGL рендер на контекст, созданный посредством sfml окна
спроси по поводу у этой гавно либы у Wraith, лучше уж SDL
Funtik
> сли ты используешь из sfml только окно, почему бы, для начала, не перевести это
> всё на glfw?
хотя-бы на SDL
хотя врядли в либе дело
SuslikМодераторwww1 ноя. 20179:31#7
Andrey
> спроси по поводу у этой гавно либы у Wraith, лучше уж SDL
Funtik
> glfw
меня это что? правильно, не интересует совершенно. sfml для демок в моём представлении — либа очень простая, прозрачная, ёмкая, мне нравится её api. не нравится — не используйте. к треду я эту информацию вообще приложил только для справки, но заранее так и знал, что налетят умники. даже если допустить, что проблемный код — где-то внутри sfml, то мне очень интересно, какой это должен быть код, чтобы вызвать такое поведение.

Правка: 1 ноя. 2017 9:32

ArochПостоялецwww1 ноя. 201711:07#8
Suslik
> Важный момент — если изменить размер моего окна хоть на 1 пиксель во время
> работы(потянув за рамку), эффект полностью пропадает и рендеринг осуществляется
> во всём окне с нормальной сокростью около 100фпс.
а если создать окно изначально на 1 пиксель меньше?
PA3UJIbПостоялецwww1 ноя. 201711:44#9
Aroch
а если создать окно изначально на 1 пиксель меньше?

Вдогонку можно предложить и вовсе шаманский вариант создать окно на пиксель больше/меньше, а затем изнутри кода изменить размер окна.

Suslik

Проблема явно воспроизводится не в любом opengl-контексте

А другие контексты, скажем, 4.1, 4.3, 4.6, 3.3, проверял?
ArochПостоялецwww1 ноя. 201711:53#10
PA3UJIb
> Вдогонку можно предложить и вовсе шаманский вариант создать окно на пиксель
> больше/меньше, а затем изнутри кода изменить размер окна.
я к тому что возможно системный какой-нибудь оверлей перекрывает своей невидимой частью его окно и сразу просадка fps идет.
PA3UJIbПостоялецwww1 ноя. 201718:33#11

Aroch
я к тому что возможно...

Понятно. Может тогда попробовать настройки Z-уровня окна? Ну, которые HWND_TOPMOST и тому подобное? В SFML есть подобные настройки?
ArochПостоялецwww1 ноя. 201718:41#12
PA3UJIb
не поможет, у меня если подвести окно к кнопке пуск также проседает fps с 1к до 200. Но не факт что это вообще его случай. В других проектах проблемы же нет, но про размеры окон он ничего не говорил )
SuslikМодераторwww2 ноя. 20172:14#13
Aroch
если окно, например, растянуть, а потом вернуть к исходному размеру, то фпс нормальный(высокий). то есть дело не в размере окна, а в некой операции при ресайзе, которая скрывает проблему.

Aroch
> какой-нибудь оверлей
если бы это был оверлей, то при перемещении окна лагучая область должна оставаться на одном и том же месте в системе координат монитора. но она перемещается вместе с окном.

MrShoorУчастникwww2 ноя. 20173:27#14
Suslik
> если бы это был оверлей, то при перемещении окна лагучая область должна
> оставаться на одном и том же месте в системе координат монитора
Как раз таки наоборот. Насколько я понимаю работает оно примерно так. NV говорит интелу: хочу рендерить вот в этот RECT. Интел говорит, отлично, оставляю вот этот DMA диапазон тебе, действуй. Видяха рисует картинку, и сливает её не на экран (экрана то нет), а сразу в DMA пакеты. А пакеты привязаны к определенному RECT. Если их не успевать копировать, то Intel будет выводить то что есть (ведь рисовать что-то надо).

В общем делаю ставку на драйвера на материнку.

Правка: 2 ноя. 2017 3:27

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Графика

2001—2017 © GameDev.ru — Разработка игр