Когда следует вызывать glGetError?

Конечный URL (после всех перенаправлений) доступен в атрибуте responseURL экземпляра XMLHttpRequest. Эта функция является новой и поддерживается только в Firefox 32 в сентябре 2014 года [ref] и в Chrome 37.0.2031.0 стабильной в августе 2014 года [ref] (и, возможно, также Opera 24) , responseURL пока не поддерживается в IE 11 или Safari 7 и более старых браузерах. Для этих браузеров предыдущий ответ по-прежнему остается верным:

XMLHttpRequest автоматически следует за перенаправлениями, не сохраняя обслуживаемые URL-адреса в свойстве. Заголовок Location не может быть извлечен через .getResponseHeader().

blockquote>

Ссылки:

16
задан Johnny Willemsen 13 January 2014 в 19:46
поделиться

3 ответа

[

]Я не уверен, является ли ваш вопрос вопросом о том, когда вы можете вызвать glGetError, если внутри glBegin/End, или это более общий вопрос об использовании glGetError в целом. Поэтому я отвечу на оба вопроса.[

] [

]То, что вы можете сделать между glBegin и glEnd, очень ограничено. Это специально, так как вы ставите GL в очень специфический режим - в середине Draw. Таким образом, все, что не имеет прямого отношения к атрибутам per-vertex, просто недействительно. Попробуйте подумать о glBegin+all, когда GL вызывает между +glEnd, как об одном вызове Draw к GL, что помогает приблизиться к тому, что GL делает на самом деле в любом случае. [

] [

] Теперь, если вы придерживаетесь простого правила, чтобы вызывать только методы атрибутов (glNormal, glTexCoord, glColor, glSecondaryColor, glIndex, glMultiTexCoord, glVertexAttrib, glVertex и некоторые другие), вы никогда не должны действительно вызывать ошибку GL во время нахождения внутри пары Begin/End. Все остальное спровоцирует ошибку. (Ошибка... ну, glMaterial - исключение. Он работает, но его использование не поощряется)[

] [

]Если ваш вопрос в том, когда можно вызвать glGetError при срабатывании ошибки внутри пары Begin/End, то ChrisF ответил в комментарии: после вызова glEnd.[

] [

]Теперь, в более широком смысле, используйте glGetError только в качестве отладочного инструмента. Моя личная предубежденность двоякая:[

] [
    ] [
  • ]проверка glGetError один раз на кадр, чтобы убедиться в отсутствии ошибок[
  • ] [
  • ]обернуть большинство вызовов GL с помощью макроса, который может проверить код ошибки GL, и включать его только при неудачной проверке на каждый кадр.[
  • ] [
] [

]Конечно, так как методы атрибутов могут быть вызваны []вне[] пары Begin/End, это немного хитро, чтобы сделать их правильными. Но на практике эти методы все равно никогда не подводят, поэтому я не утруждаюсь их макро-проверкой.[

] [

]Лакомый кусочек мелочи: GL API был изначально спроектирован так, что клиентская реализация на самом деле не могла знать, произошла ли ошибка на месте вызова. Например, если GL действительно был реализован на удаленной машине (как в дни SGI), то вызов, скажем, glTexEnv с целью не GL_TEXTURE_ENV мог быть просто добавлен в буфер команд, и в этот момент ошибка не записывалась. [

] [

] Если бы вы затем вызвали glGetError, то клиентская сторона должна была бы промыть буфер команд на GL-сервере, дождаться обработки буферизированных команд, получить код ошибки обратно и вернуть соответствующий код ошибки приложению.[

] [

] Если это звучит тяжело, то это потому, что так и было. Кстати, это было основной причиной, по которой не каждый вызов возвращал код ошибки, а вызов glGetError считался нормальным только в целях отладки. В наши дни большинство реализаций GL работают с управлением всеми состояниями в одном процессе, так что, как я уже говорил, это действительно мелочь для большинства пользователей.[

] [

]И последнее, всякий раз, когда я говорю о Begin/End, я чувствую, что мне нужно сказать, что вам, наверное, стоит посмотреть на то, чтобы вообще не использовать его. Речь идет о худшем способе рисования с GL.[

]
22
ответ дан 30 November 2019 в 21:03
поделиться

Обычно нужно вызывать glGetError после каждого другого вызова gl..., так как одним из эффектов вызова является очистка стека ( из MSDN):

Когда происходит ошибка, флаг ошибки устанавливается на соответствующее значение кода ошибки. Никакие другие ошибки не записываются до тех пор, пока не будет вызван glGetError, код ошибки не будет возвращен, а флаг будет сброшен на GL_NO_ERROR.

Однако, если у вас есть вызовы, обернутые в glBegin и glEnd, вызовите glError после glEnd. Это должно вернуть Вам правильный код ошибки (если он был) и очистить стек ошибок.

.
4
ответ дан 30 November 2019 в 21:03
поделиться

Некоторые философии кодирования ожидают, что каждая программа проверить все возможные ошибки, а соответствующим образом обрабатывает эти ошибки. Тем не менее, после одного из тех философий требуется много дополнительного кода, и может значительно замедлить программу. На практике я использую только GLGETERROR, только когда я диагностирую проблему, либо пишу некоторый код, который имеет значительную возможность неспособности и соответствующим действием после ошибки.

В первом случае диагностируйте проблему, я использую одну из двух стратегий. Поскольку OpenGL не записывает новые ошибки до тех пор, пока не вызывается GlgetError, я могу либо проверять ошибки один раз через мой основной цикл. Это говорит мне первую ошибку, которую я затем отслеживает, и, надеюсь, исправить. Другая стратегия, которую я использую, когда я сужался к некоторому проблемным кодексе, но я не уверен, какой звонок вызывает проблему. После каждого GL ... Позвоните за пределы Глбегина. Отказ Отказ Глинированный блок я позвоню GlgetError и сообщаю о любых ошибках. Это скажет мне, именно, какой GL ... Call вызывает проблему и, надеюсь, начнут меня на пути к исправлению.

Во втором случае, обоснованно программирование для вероятной ошибки, я позвоню в GlgetError, чтобы очистить флаг ошибки, сделать мой другой GL ... Call (S), затем вызовите GlgetError. Тогда я беру любые действия, необходимые для борьбы с любыми отчетами GlgetError.

3
ответ дан 30 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: