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);
}