Допустим, я пишу обертку для объекта OpenGL. При работе с безопасностью исключения я тоже хочу объяснить ошибки OpenGL (I.E., когда происходит, метод, вызывающий функцию OpenGL, возвращает код ошибки или выбрасывает исключение). Намерение для этого является не отладки во время сборки отладки, но для обработки любых возможных ошибок во время выполнения постройки выпуска. Есть ли способы достичь этого?

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

1
user11824328 29 Сен 2019 в 20:45

1 ответ

Лучший ответ

Допустим, я пишу обертку для объекта OpenGL.

Шаг 1: Не делай этого. Я знаю, что звучит Flippant, но, пожалуйста, не. Я могу понять, желаю управляемого типа объекта, как unique_ptr, но для объектов OpenGL. Но любая упаковка за пределы этого, почти наверняка вредит вам гораздо больше, чем это помогает. Особенно, если абстракция неверна. Взаимодействие между объектами OpenGL и механизмами, как правило, не подходит для такого рода вещей.

Вы получите гораздо больше из настроителя OpenGL Прямой государственный доступ вызовы, непосредственно, чем упаковка функций OpenGL за некоторыми интерфейсом объекта. Ваш код не волшебно становится лучше, используя функции членов.

Когда происходит, необходимо, способ, вызывающий функцию OpenGL, возвращает код ошибки или выбрасывает исключение

Шаг 2: не делай этого. Большинство ошибок OpenGL являются ошибками использования (то есть вы использовали API неправильно). И ошибки использования должны быть обработаны на не в виде исключения C ++. Исключения должны быть для таких условий, как неверный ввод или текстура с неожиданным форматом. Вещи, которые выходят из-за пределов кода. Использование исключений для обработки ошибок программирования, как правило, не полезная идея.

Если вам нужно отладить приложение OpenGL, в основном есть два способа обработки его. Для повседневной проверки вам следует использовать Отладка вывода для регистрации любых ошибок, которые ты получаешь. Это особенно полезно для настроек типа «Выпуск» (хотя вам все еще нужно использовать Отладка контекста Для обеспечения поддержки отладки вывода).

Если вы получите ошибку, вы можете загрузить RenderDoc или аналогичный инструмент, который может точно сказать вам, где была сгенерирована ошибка. В качестве альтернативы, вы можете настроить вывод отладки, чтобы она давала вам синхронные сообщения об ошибках вместо ошибок ASYNC, чтобы вы могли просто остановить точку в середине откуда откуда ошибка. В любом случае, вы должны иметь возможность легко отслеживать его с минимальным специализированным кодом и главное, без функциональных функций.

Действительно, RenderDoc и аналогичные инструменты гораздо полезны для отслеживания ошибок OpenGL в выпуске сборки, чем все, что можно разумно написать. Вы можете получить след всех ваших вызовов OpenGL с значениями параметров и тому подобным. Это просто лучший способ обрабатывать ошибки.

2
Nicol Bolas 29 Сен 2019 в 18:31