SDL_RenderPresent зависает навсегда

Я столкнулся с необъяснимой ошибкой в ​​SDL 2.0.3 при использовании графики с аппаратным отображением. По какой-то причине, примерно через 5 минут после запуска программы мое графическое окно закрывается, но мое окно консоли остается открытым. Там не выдается ошибка или что-либо, что означает проблему.

Когда я приостанавливаю отладчик, программа помещает точку останова в SDL_RenderPresent (). Я последовал за стеком вызовов функции внутри ntdll.dll под названием WaitForSingleObject (), но я не уверен, что вызывает его зависание навсегда.

Кроме того, этого не происходит, когда я использую графику с программным обеспечением. Я использую его на AMD FirePro M5100 FireGL V с установленными последними драйверами.

Мой вопрос: кто-нибудь знает, что может привести к тому, что SDL_RenderPresent () никогда не вернется?

0

Решение

Из описания видно, что есть блокировки, не освобождаемые нижними уровнями графического конвейера.

Из того, что это происходит через 5 минут, кажется, что где-то есть утечка ресурсов.

Все это, конечно, просто дикая догадка, но я бы сказал, что либо код приложения, либо код SDL пропускают ресурсы (дескрипторы текстур, вершинные буферы и т. П.) И ту часть кода (либо на нижнем уровне). Уровни SDL или в драйвере) когда заканчивается, не ведет себя хорошо (это часто случается … во многих случаях условия с низким ресурсом не очень хорошо проверены и обработаны).

Этого не происходит при рендеринге программного обеспечения, потому что ресурсы там практически не ограничены. Подтверждением такого рода проблем может быть то, что при работе в программном рендеринге программа работает, но использование памяти процесса продолжает расти и расти.

Обратите внимание также на любой код, который «перехватывает» любое исключение / сбой и продолжает работать после этого. Написание сложного программного обеспечения, которое работает правильно после ненормального состояния, чрезвычайно сложно (в принципе невозможно за тривиальными случаями, потому что безопасность исключений не масштабируется по составу: единственный способ, который не делает сложность взрывающейся, состоит в том, чтобы иметь логические разделительные «стены» и -инициализировать целые подсистемы).

1

Другие решения


По вопросам рекламы [email protected]