2010-03-14 2 views
0

Я запускаю ошибку «из памяти» из OpenGL на glReadPixels() в условиях низкой памяти. Я пишу подключаемый модуль к программе с мощным механизмом кучи для таких ситуаций, но я понятия не имею, можно ли использовать OpenGL для ее использования для управления памятью приложения. Понятие о том, что это даже возможно, привлекло мое внимание через эту [хотя и датированную] нить по аналогичной проблеме в Mac OS [not X]: http://lists.apple.com/archives/Mac-opengl/2001/Sep/msg00042.htmlOpenGL «out of memory» на glReadPixels()

Я использую Windows XP и видел ее на нескольких картах NVidia. Меня также интересуют любые работы, которые я мог бы передать пользователям (в потоке упоминается «увеличение виртуальной памяти»).

Thanks, Sean

ответ

1

Я совершенно уверен, что ошибка из памяти не повышена с glReadPixels (infact glReadPixels не выделяет память).

Ошибка, вероятно, связана с другими подпрограммами, выделяющими объекты буфера или текстуры. Как только вы обнаружите ошибку вне памяти, вы должны освободить все необязательные объекты буфера (текстуры, текстурные мип-карты, редко используемые объекты буфера), чтобы выделить новый объект-буфер, содержащий возвращаемые данные glReadPixels.

+0

Вы были совершенно правы! В моем коде была ошибка, из-за которой код ошибки попадал на проверку ошибок на glReadPixels(). Спасибо, что вырвали меня из моей ментальной клетки на этом ... – spurserh

+0

Как вы можете быть «совершенно уверены» glReadPixels ничего не выделяют? Это полностью зависит от реализации. – Bahbar

+0

@Bahbar: GL_OUT_OF_MEMORY не означает, что malloc не удалось! Это связано с графической памятью, и каждый вызов OpenGL хорошо определяет каждый код ошибки, который может вернуться! Я «уверен», потому что не могу сказать, что конкретная реализация OpenGL соответствует спецификации; но если это так, glReadPixels не может вернуть GL_OUT_OF_MEMORY. – Luca

0

Без особых деталей, трудно сказать. В конечном итоге OpenGL собирается поговорить с родной ОС, когда ему нужно выделить. Поэтому, если ничего другого, вы всегда можете заменить (или перехватить) распределенный блок CRT/кучи по умолчанию для вашего процесса и получить из него блоки из «более надежного» менеджера кучи в хосте плагина.