Войти
ПрограммированиеФорумГрафика

Утечки памяти SDL, OpenGL

#0
15:05, 9 июня 2014

Здравствуйте.

Создал клас для создания, удаления и перемещения прямоугольных поверхностей в OpenGL. Касс использую как динамический массив, то есть создаю с помощью new  некоторое количество прямоугольных поверхностей, когда они становятся не нужны, удаляю их с помощью delete. Заметил что каждый раз при создании поверхностей память выделяется, но после удаления класса, память не освобождается. Пытался отыскать утечки с помощью valgrind, но результата не получил. В самом классе malloc встречается только один раз и сразу же я освобождаю занятую память. В общем не могу понять что не так.

Вот мой класс, гляньте кто-нибудь, может увидите то что не вижу я.

LocationImage.h

+ Показать

LocationImage.cpp

+ Показать

Думаю проблема где-то в методе Init()


#1
15:08, 9 июня 2014

Вот пример использования класса

+ Показать

За каждую секунду расходуется 4МБ памяти=(

#2
15:13, 9 июня 2014

Ты же в цикле постоянно загружаешь в память текстуру зачем?
И ты на одну картинку используешь свой ВБО? Это же бред
И все эти расширения....

Ты напихал все в один класс.
Сделай получение расширений отдельно методом при старте один раз
Для загрузки картинки напиши класс или метод
А классе картинки храни  ID текстуры ее координаты


Как минимум запусти так и посмотри уходит память или нет:

#include <GL/gl.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include "LocationImage.h"

SDL_Surface * Surf_Display;
LocationImage * Fon;

int main()
{

    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0)
    {
        return 1;
    }
    SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
    if((Surf_Display = SDL_SetVideoMode(1024, 768, 32, SDL_OPENGL)) == NULL)
    {
        return 1;
    }

    float xbegin = -100;
    float ybegin = -100;
    float xend = 100;
    float yend = 100;

    Fon = new LocationImage[1];
    Fon->Init("fon.JPG", xbegin, ybegin, xend, yend);

    while(1)
    {
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        Fon->Render();
        SDL_GL_SwapBuffers();
    }
    delete [] Fon;

    return 0;
}

#3
16:36, 9 июня 2014

Это был лишь пример использования класса, а у меня всё происходит по другому. Вот например кликну я мышью в одном месте экрана и в зависимости от места куда я кликнул происходит загрузка какого-то количества прямоугольников. Кликну я в другом месте, удаляются загруженные прямоугольники и создаются новые. В общем количество прямоугольников и какие именно картинки будут на этих прямоугольниках зависит от места куда я кликну и от данных которые приходят с сервера. На одну картинку использую ВБО так как под рукой уже был готовый код, который я использовал в другом проекте, а точнее сказать единственном своём рабочем проекте на SDL+OpenGL и по другому как это сделать я не знаю=(

Приведённый выше код памяти не расходует, но не сгодится.

#4
16:53, 9 июня 2014

Нет в SDL утечек, начни облегчать код, удаляй по очереди все места где происходят манипуляции с памятью, пофиг что-то рендерится перестанет, так ты найдешь место где все происходит.

#5
16:54, 9 июня 2014

Ну или начни заменять массивы векторами, а сырые указазатели умными, меняй по одному и запускай:)

#6
17:20, 9 июня 2014

Спасибо за совет, удалось обнаружить кусок кода без которого память не расходуется

SDL_Surface * img = IMG_Load(image.c_str());
TargetSDLLoadSurface(GL_TEXTURE_2D, img);

Я ведь использовал

SDL_FreeSurface(img);

Так почему же память не освобождается? Кто-нибудь знает?

#7
19:46, 9 июня 2014

Сделал SDL_Surface * img; приватным членом класса и удаление его с помощью SDL_FreeSurface(img); теперь произвожу в деструкторе. Если не использовать TargetSDLLoadSurface(), то память не расходуется. Осталось только понять почему с этим методом она расходуется?

+ Показать

Этими функциями со мною поделился кто-то с этого форума, без них у меня были проблемы с цветами.

#8
20:05, 9 июня 2014

Темный
> Если не использовать TargetSDLLoadSurface(), то память не расходуется.

Ошибка в этой функции.

#9
20:18, 9 июня 2014

Спасибо за подсказку, сам бы я не додумался до этого. Заменил TargetSDLLoadSurface() на

+ Показать

И снова получил утечку=( Без этого не отображается изображение, а с этим утечки памяти. Что бы мне выбрать?

#10
6:27, 10 июня 2014

Темный
> glGenTextures(1, &colorTexture);
А удалять кто будет?

#11
19:52, 10 июня 2014

Добавил в деструктор glDeleteTextures(1, &colorTexture); и утечки прекратились, вся проблема была именно в этом. Спасибо за помощь.

ПрограммированиеФорумГрафика

Тема в архиве.