Zużycie pamięci

0

Program zabiera 13 tysięcy kilobajtów pamięci i co sekundę ta wartość zwiększa się o 3 tysiące kilobajtów
mimo, że po wyświetleniu kasuję wczytany obraz.
Problemem może być to że wczytuje, wyświetlam i kasuję obraz w pętli (funkcji renderującej).
Czym spowodowane jest tak duże zużycie pamięci?
Grafikę wczytuję biblioteką DevIL.
Funkcja wczytująca:

ILuint LoadImage(char *Path)
{
	// tworzenie tablicy do przechowania tekstury
	ILuint ImgID;

	// pobranie szerokosci obrazu
	//ILuint WidthImage = ilGetInteger(IL_IMAGE_WIDTH); 

	// pobranie wysokosci obrazu
	//ILuint HeightImage = ilGetInteger(IL_IMAGE_HEIGHT);

	// generowanie nazwy obrazu
	ilGenImages(1, &ImgID); 

	// wybranie biezacego obrazu
	ilBindImage(ImgID);

	// ladowanie obrazu z pliku
	ilLoadImage(Path);

	// obsluga bledow
	if(ilGetError() != IL_NO_ERROR)return ilGetError();

	// zwaracnie tekstury
	return ImgID;
}

Funkcja wyświetlająca:

void DrawImage2D(int x, int y, ILint WidthImage, ILint HeightImage, ILuint ImgID)
{
	// generowanie nazwy tekstury
	glGenTextures( 1, & ImgID );

	// wybranie biezacej tekstury
        glBindTexture( GL_TEXTURE_2D, ImgID );

	// tworzenie tekstury
	glTexImage2D( GL_TEXTURE_2D, 0, ilGetInteger( IL_IMAGE_BPP ), ilGetInteger( IL_IMAGE_WIDTH ), 
	   ilGetInteger( IL_IMAGE_HEIGHT ), 0, ilGetInteger( IL_IMAGE_FORMAT ), GL_UNSIGNED_BYTE, ilGetData() );

	// ustalenie parametrów tekstury
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
   	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
   	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
   	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

	// ustalenie trybu teksturowania
	glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);

	// ustalenie koloru kwadratu 
	glColor3f( 0.0, 0.0, 0.0 );

	// rysowanie kwadratu pod teksture
	glBegin( GL_QUADS );

	  glTexCoord2f( 0, 0 );
          glVertex2f( x, y );

	  glTexCoord2f( 1, 0 );
          glVertex2f( x + WidthImage, y );

	  glTexCoord2f( 1, 1 );
          glVertex2f( x + WidthImage, y + HeightImage );

	  glTexCoord2f( 0, 1 );
          glVertex2f( x, y + HeightImage );

	glEnd();
}

Funkcja kasująca:

void DeleteImage(ILuint ImgID)
{
	// kasowanie obrazu
	ilDeleteImages(1, & ImgID);
}

Funkcja renderująca:

void Display()
{
     // deklaracja zmiennej na obraz
     ILuint Texture = NULL;

    // ladowanie obrazu
    Texture = LoadImage(".\\Graphics\\ABC.png");

    // wlaczenie teksturowania 
    glDisable(GL_TEXTURE_1D);
    glEnable(GL_TEXTURE_2D);

    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
   
    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT );

    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );
   
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();

    /* Poczatek sceny 3D */
    
    // ustawienie obserwatora
    gluLookAt( eyex, eyey, eyez, centerx, centery, centerz, 0, 1, 0 );
    
    // wylaczenie teksturowanie
    glDisable(GL_TEXTURE_2D);
    // kolor krawędzi sześcianu
    glColor3f( 0.0, 0.0, 0.0 );
   
    // początek definicji krawędzi sześcianu
    glBegin( GL_LINES );
   
    // wspólrzędne kolejnych krawędzi sześcianu
    glVertex3f( 1.0, 1.0, 1.0 );
    glVertex3f( 1.0, - 1.0, 1.0 );
   
    glVertex3f( 1.0, - 1.0, 1.0 );
    glVertex3f( 1.0, - 1.0, - 1.0 );
   
    glVertex3f( 1.0, - 1.0, - 1.0 );
    glVertex3f( 1.0, 1.0, - 1.0 );
   
    glVertex3f( 1.0, 1.0, - 1.0 );
    glVertex3f( 1.0, 1.0, 1.0 );
   
    glVertex3f( - 1.0, 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, 1.0 );
   
    glVertex3f( - 1.0, - 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, - 1.0 );
   
    glVertex3f( - 1.0, - 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, - 1.0 );
   
    glVertex3f( - 1.0, 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, 1.0 );
   
    glVertex3f( 1.0, 1.0, 1.0 );
    glVertex3f( - 1.0, 1.0, 1.0 );
   
    glVertex3f( 1.0, - 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, 1.0 );
   
    glVertex3f( 1.0, - 1.0, - 1.0 );
    glVertex3f( - 1.0, - 1.0, - 1.0 );
   
    glVertex3f( 1.0, 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, - 1.0 );
   
    // koniec definicji prymitywu
    glEnd();

    // funkacja rysujaca szescian (moja)
    //Prism();

    // wlaczenie teksturowania
    glEnable(GL_TEXTURE_2D);

    // Zapisz macierzy rzutowania
    glMatrixMode (GL_PROJECTION);
    glPushMatrix ();
   
    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();
    
    // wybór macierzy projekcji
    glMatrixMode(GL_PROJECTION);
    // macierz tekstury = macierz jednostkowa
    glLoadIdentity();

    /* Przełączenie w tryb rzutowania ortogonalnego */
    glOrtho(0,width,height,0,-100,100);

    // wybór macierzy modelowania tekstury
    glMatrixMode(GL_TEXTURE);
    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();

    // obrócenie sceny o 40 stopni w osi X i Y
    //glRotated(40, 1.0, 1.0, 0.0);

    /* rysowanie obiektów 2D */
    DrawImage2D(10, 10,ilGetInteger( IL_IMAGE_WIDTH ),ilGetInteger( IL_IMAGE_HEIGHT ),Texture);

    // powrót do trybu macierzy ModelView
    glMatrixMode (GL_MODELVIEW);

    // powrót starego prespective macierzy rzutowania
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);

    // skierowanie poleceń do wykonania
    glFlush();
   
    // zamiana buforów koloru
    glutSwapBuffers();

    // kasowanie tekstury
    DeleteImage(Texture);
}
0

Może spróbuj w funkcji DeleteImage przekazać argument przez referencję...

0

Problemem może być to że wczytuje, wyświetlam i kasuję obraz w pętli (funkcji renderującej).

Ale po co?
Nie znam się na DevIL-u, ale ilDeleteImages prawdopodobnie zwalnia tylko bitmapę z devIL-a (coś co można zrobić od razu po glTexImage2D) a nie zwalnia tekstury z OpenGL-a.

Spróbuj dodać glDeleteTextures, albo używać cały czas tego samego id tekstury (czyli odpalasz glGenTextures tylko raz na początku).

Ale serio, nie możesz załadować bitmapy po prostu raz, na początku?
czy to tylko taki test na wyciek pamięci?

0

Spróbuj dodać glDeleteTextures, albo używać cały czas tego samego id tekstury (czyli odpalasz glGenTextures tylko raz na początku).

Dodałem i już nie ma wycieków pamięci.

Ale serio, nie możesz załadować bitmapy po prostu raz, na początku?
czy to tylko taki test na wyciek pamięci?

To tylko taki test bo nie wyobrażam sobie takich przykładowych 10 bitmap ładowanych ok. 200/s :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1