OpenGL: вылетает при случайном вызове функции OpenGL - PullRequest
0 голосов
/ 12 августа 2010

У меня странная проблема, сбой происходит в случайное время, например, мне удалось какое-то время использовать 3d-приложение без сбоев, затем в большинстве случаев оно вылетало всегда, когда я неожиданно рендерил много объектов одновременно,

Недавно я заметил, что изменение огромной текстурной поверхности на этой карте ATI приведет к поломке всего моего компьютера при использовании огромных размеров текстур и их большого количества и переключении с одного на другое в одном кадре.Так что есть вероятность, что я сломал карту ATI или просто глючил.Но это невозможно, так как я недавно добавил некоторый код, и теперь я впервые заметил этот сбой.Я не использовал никаких специальных вызовов opengl, просто старый добрый glbegin () glend () glcolor () и т. Д. *

Если я закомментирую строку, в которой она вылетала ранее, например glBegin (GL_QUADS) ... glEnd () Затем в следующий раз я получаю сбой при вызове другой функции openGL в другом месте моего кода, например, glColor4f (), а затем я закомментирую это, и следующий сбой я получу в glClear () в совершенно другой частикод рендеринга!

Что может быть причиной этого?Я использую карту ATI, и я знаю, что некоторые вызовы opengl могут привести к сбою программы, если они используют неправильные значения, например, glLineWidth (4) приведет к сбою некоторых карт ATI в произвольной строке кода openGL, поскольку максимальная ширина строки равна 3!

Редактировать:

Когда я запускаю программу в режиме отладки с ApplicationVerifier, она выдает мне следующую строку:

if(!(PixelFormat = ChoosePixelFormat(hDC, &pfd))){

Я не понимаю, что может быть не так в этом?

пфд:

static PIXELFORMATDESCRIPTOR pfd = {
   // *correct amount of elements*
};

Ответы [ 2 ]

0 голосов
/ 12 августа 2010

IMO, вполне вероятно, что сбой в OpenGL является лишь симптомом, а настоящая проблема кроется в другом месте. В целом, ваше описание звучит более или менее типично для неправильного использования ресурсов (например, утечка памяти, использование висящего указателя, разрушение кучи и т. Д.)

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

0 голосов
/ 12 августа 2010

Такое случайное поведение обычно является признаком повреждения стека / кучи.Вы должны убедиться, что вы не повреждаете кучу и / или стек.Багги-драйверы также возможны, поскольку сбой при неверном значении является ошибкой, которая не должна приводить к сбою и вместо этого приводит к ошибке GL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...