Как восстановить память после активации glutMainLoop?

Согласно документации OpenGL, 3.1 glutMainLoop

glutMainLoop входит в цикл обработки событий GLUT.

Использование

void glutMainLoop(void);

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

Поэтому всякий раз, когда вызывается glutMainLoop(), он никогда не вернется. Как следствие, я не смог освободить свою память после выделения. Моя проблема: Мне нужно загрузить изображение из файла, решение книги (Superbible 4th edition) - разместить эту загрузочную файловую процедуру внутри функции рисования. Тем не менее, я понял, что этот метод слишком дорог из-за нескольких файлов открытия и закрытия. Я вспомнил из своего класса Data structure при изучении B-дерева, стоимость доступа к внешним ресурсам значительна, поэтому я стараюсь избегать столько, сколько могу. Таким образом, мое альтернативное решение заключается в том, чтобы поместить эту загрузочную процедуру изображения внутри установленной функции сцены, которая вызывается только один раз. Но теперь я сталкиваюсь с другой проблемой, я не могу удалить память из-за glutMainLoop. Что я могу сделать в этой ситуации? Я новичок в openGL, поэтому я действительно не знаю, как справиться с этой конкретной проблемой. Любая идея была бы с благодарностью.

#include <cstdio> 
#include <cstdlib>
#include <iostream>
#include "Utility.h"
#include "TgaHeader.h"
#include "TgaImage.h"
#include <gl glut.h="">
using namespace std;
TgaImage* image = NULL;
void setupScene() {
 // set color background
 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
 // load image from file
 image = loadTgAFile( "Fire.tga" );
}
void renderScene() {
 // clear color
 glClear( GL_COLOR_BUFFER_BIT );
 // TGA format is 1 byte aligned
 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
 glRasterPos2i( 0, 0 );
 if( image != NULL ) {
 glDrawPixels( 
 image->header.width, 
 image->header.height,
 image->format,
 GL_UNSIGNED_BYTE,
 image->pixels
 );
 }
 glutSwapBuffers();
}
void resizeWindow( int w, int h ) {
 if( h == 0 ) {
 h = 1;
 }
 glViewport( 0, 0, w, h );
 // reset coordinate before modifying
 glMatrixMode( GL_PROJECTION );
 glLoadIdentity();
 // set the clipping volume
 gluOrtho2D( 0.0f, w, 0.0f, h );
 // reset to modelview matrix
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity();
}
int main( int argc, char** argv ) {
 glutInit( &argc, argv );
 glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
 glutInitWindowSize( 512, 512 );
 glutCreateWindow( "Image" );
 // register callback
 glutReshapeFunc( resizeWindow );
 glutDisplayFunc( renderScene );
 // initialize scene
 setupScene();
 glutMainLoop();
 // it will never reach this 
 delete image;
}
</gl></iostream></cstdlib></cstdio>

Спасибо,

2 ответа

"Рекомендуемым" механизмом является использование функции atexit или onexit для планирования функции, вызываемой при выходе из программы:

void exitProgram() {
 // cleanup code
}
// then put this in main():
atexit( exitProgram );

Обратите внимание, что как только программа выйдет, операционная система очищает все ресурсы, включая память, которые использовала программа, поэтому она не имеет технически утечки памяти.


Каждая нормальная операционная система собирается вернуть память, занятую процессом после ее выхода. Поэтому вам не нужно ничего делать. Когда вы вызываете exit, память будет отпущена.

Другая причина, по которой ваша программа медленная, заключается в том, что вы используете glDrawPixels. Правильным способом было бы загрузить изображение в текстуре (вы делаете это перед входом в основной цикл), а в обратном вызове отображения визуализируйте текстуру. Таким образом, вы, скорее всего, увидите значительное улучшение вашей программы.

licensed under cc by-sa 3.0 with attribution.