OpenGL (SDL)

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

OpenGL

Сообщение BratSinot »

Использую OpenGL вместе с OpenGL. После каждой DrawImage увеличивается размер памяти занимаемой программой(смотрел только в Windows XP, ибо в Slackware это проблематично; и видел только системную память, ибо видео память видеть проблематично). Что не так? Уже миллион примеров перерыл, ничего не нашел.

Код:

struct oglpic { SDL_Surface *pic; //GLuint texture=NULL; GLuint texture; //GLenum texture_format=NULL; GLenum texture_format; GLint nofcolors; int x; int y; } oglpic[8]; void init_GL() { //glClearColor(0, 0, 0, 0); glEnable(GL_TEXTURE_2D); glViewport (0, 0, 590, 590); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 590, 590, 0, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void loadImage(int num) { oglpic[num].nofcolors=oglpic[num].pic->format->BytesPerPixel; if(oglpic[num].nofcolors==3) { if(oglpic[num].pic->format->Rmask==0x000000ff) oglpic[num].texture_format=GL_RGBA8; else oglpic[num].texture_format=GL_BGR; } else if(oglpic[num].nofcolors==4) { if(oglpic[num].pic->format->Rmask==0x000000ff) oglpic[num].texture_format=GL_RGBA; else oglpic[num].texture_format=GL_BGRA; } else printf("warning: the image is not truecolor…this will break "); glGenTextures(1, &oglpic[num].texture); glBindTexture(GL_TEXTURE_2D, oglpic[num].texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, oglpic[num].nofcolors, oglpic[num].pic->w, oglpic[num].pic->h, 0, oglpic[num].texture_format, GL_UNSIGNED_BYTE, oglpic[num].pic->pixels); SDL_FreeSurface(oglpic[num].pic); } void drawImage(int num, int x, int y) { glBindTexture(GL_TEXTURE_2D, oglpic[num].texture); glBegin(GL_QUADS); // Top-left glTexCoord2i(0, 0); glVertex2i(x, y); // Bottom-left glTexCoord2i(1, 0); glVertex2i(x+oglpic[num].x, y); // Bottom-right glTexCoord2i(1, 1); glVertex2i(x+oglpic[num].x, y+oglpic[num].y); // Top-right glTexCoord2i(0, 1); glVertex2i(x, y+oglpic[num].y); glEnd(); glLoadIdentity(); }

В конце программы естественно выполняется glFlush() и SDL_GL_SwapBuffers(). Пробовал подключить glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT), но не помогает.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

В drawImage нет ничего такого. Попробуйте закоментировать всё в этой функции и снова посмотреть на результат изменения памяти. Вполне возможно, что утечка идёт в другом месте. Может где-то случайно вызываете повторно loadImage?
Спасибо сказали:
i18n
Сообщения: 192

Re: OpenGL

Сообщение i18n »

Под линуксом для поиска утечек памяти применяется valgrind. Гораздо удобнее, чем медитировать над кодом и искать пропущеный delete.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OpenGL

Сообщение BratSinot »

NickLion
i18n

Не, у меня он отрисовывает я делаю
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
И когда я делаю drawImage, он мне рисует еще раз и естественно старое в памяти остается. По крайней мере я так понял.

//Гораздо удобнее, чем медитировать над кодом и искать пропущеный delete
А что мне удалять? Текстуры? Зачем? Чтоб их заново загружать?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

Повторю ещё раз - в коде drawImage я не вижу ничего, что может вызвать утечку памяти. Рисует-то оно на старом. Буфер один, не важно - очищать его или нет. В этой функции вообще ничего не выделяется.
Поэтому давайте попробуем что-то из этого:
1. Вы комментируете всё в функции drawImage и смотрите на изменения памяти (то, что не будет рисоваться - ясно, но это не интересует). Мне просто кажется, что утечка вообще не относится к данной функции.
2. Используете средства для отлова утечки памяти (valgrind, memleak, etc).
3. Прикладываете архив с кодом, чтобы на это взглянул кто-то другой свежим взором и нашёл утечку, если она есть. Если не хотите выкладывать - можно в личку.
Спасибо сказали:
i18n
Сообщения: 192

Re: OpenGL

Сообщение i18n »

Про glClear все подробно описано вот тут: http://www.opengl.org/sdk/docs/man/xhtml/glClear.xml Грубо говоря, она просто заполняет выбранные буферы указанными ранее значениями. К утечкам памяти, соответственно, отношения не имеет.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OpenGL

Сообщение BratSinot »

NickLion писал(а):
24.04.2010 09:23
3. Прикладываете архив с кодом, чтобы на это взглянул кто-то другой свежим взором и нашёл утечку, если она есть. Если не хотите выкладывать - можно в личку.

Исходники выложил.
Увеличивается память после того как кто-нибудь выиграл и ты нажимаешь 'n'(строчка 107, файл xo.c), либо после того как ничья и ты жмешь кнопку 'n'(строчка 255, файл xo.c).

P.S. Я знаю что код ужасно выглядит, но пока по другому я не умею.

Грубо говоря, она просто заполняет выбранные буферы указанными ранее значениями. К утечкам памяти, соответственно, отношения не имеет.

Я это понял после того как методом научного тыка потыкал и почитал мануалы.

1. Вы комментируете всё в функции drawImage и смотрите на изменения памяти (то, что не будет рисоваться - ясно, но это не интересует). Мне просто кажется, что утечка вообще не относится к данной функции.

Не, то что оно не относится это понятно, просто "счетчик памяти" запаздывает, вот и создалось неверное представление.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

BratSinot писал(а):
24.04.2010 12:57
Исходники выложил.

Хм. А где они?...
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OpenGL

Сообщение BratSinot »

Вот.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
i18n
Сообщения: 192

Re: OpenGL

Сообщение i18n »

Начать с того, что программа вообще не работает как должна. Вместо заявленной графики отображается некое непонятное мерцание, это раз. Код, к сожалению, совершенно нечитаемый, это два. Прогон valgrind ничего не дал, все замечания относятся к системным библиотекам, а в пользовательском коде утечек не обнаружено. В этой куче кода, кстати, не удалось обнаружить вызов glDeleteTextures, который должен удалять текстуры при завершении работы программы. В общем, для начала нужно привести код в порядок, после этого искать ошибки будет значительно проще.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: OpenGL

Сообщение Alxn1 »

Да, код конечно не блещет и вызывает страх. :)

Почему у i18n все рисуется криво я, кажется, догадался - текстуры у вас вообще непойми как создаются. Проверок на то, что железка поддерживает NonPowerOfTwo-текстуры нет (текстуры, размер которых не является степенью двойки). И если видеокарта этого не умеет - текстуры не создадутся. Что, видимо, и происходит - все BMP-файлы в архиве имеют разный размер, никак к степени 2-х не относящийся.

И память, мне кажется, не течет. Просто fprintf выделяет буфер для внутренних нужд, а потом free не отдает его системе, а оставляет во внутреннем кэшэ. Это нормально. Если я прав - то там незначительно должно потребление памяти увеличиваться каждый раз. Максимум на килобайт-два.
Спасибо сказали:
i18n
Сообщения: 192

Re: OpenGL

Сообщение i18n »

glxinfo пишет, что расширение GL_ARB_texture_non_power_of_two поддерживается. Так что проблема скорее в чем-то другом. Собственно текстуры как раз загружаются, но старые кадры мерцают на фоне новых и получается полнейшая мешанина.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

Потестил. Не знаю, но ничего никуда не растёт. Тестил под линуксом, openSUSE x86_64. Работать программка работает, но с отрисовкой есть проблемы. Если отключён композит и часть окна перекрывается - она перерисовывается какой-то гадостью :) Либо чёрным фоном :)
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: OpenGL

Сообщение Alxn1 »

i18n писал(а):
25.04.2010 00:46
glxinfo пишет, что расширение GL_ARB_texture_non_power_of_two поддерживается. Так что проблема скорее в чем-то другом. Собственно текстуры как раз загружаются, но старые кадры мерцают на фоне новых и получается полнейшая мешанина.


А, там еще glClear заккоментировано в xoinit, и вызывается ли оно каждый кадр - я хз, а разбираться лень :) Но в любом случае, изначально надо все-таки проверять на GL_ARB_texture_non_power_of_two и хотя бы вываливаться с сообщением. Пока еще, если постараться, можно найти такую карточку, которая бы это не умела.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: OpenGL

Сообщение BratSinot »

Епрст! Народ, але?! Вы чего? Это вам не проект даже, а просто отработка. Какие нафиг проверки? Когда буду что-то делать, тогда и буду.

Просто fprintf выделяет буфер для внутренних нужд, а потом free не отдает его системе, а оставляет во внутреннем кэшэ. Это нормально. Если я прав - то там незначительно должно потребление памяти увеличиваться каждый раз. Максимум на килобайт-два.

Нет, не прав. В простой SDL версии все нормально.

/*Начать с того, что программа вообще не работает как должна. Вместо заявленной графики отображается некое непонятное мерцание, это раз.*/
У меня работает.

//Код, к сожалению, совершенно нечитаемый, это два.
А я его че, как мануал писал чтоль? Я его наизусть знаю и что у меня где. Сами попросили.

/*А, там еще glClear заккоментировано в xoinit, и вызывается ли оно каждый кадр - я хз, а разбираться лень*/
У меня каждый кадр заново не рисуется. У меня если что-то нарисовалось, оно второй раз не рисуется.

/*Почему у i18n все рисуется криво я, кажется, догадался - текстуры у вас вообще непойми как создаются. Проверок на то, что железка поддерживает NonPowerOfTwo-текстуры нет (текстуры, размер которых не является степенью двойки). И если видеокарта этого не умеет - текстуры не создадутся. Что, видимо, и происходит - все BMP-файлы в архиве имеют разный размер, никак к степени 2-х не относящийся.*/
Пойми как они создаются. Загружаются в SDL_Surface и уже от туда идет информация для генерации OpenGL текстуры.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: OpenGL

Сообщение NickLion »

BratSinot, не принимайте близко к сердцу. Но критику учтите ;)
На линуксе никаких изменений в памяти не обнаружил. Проверял в krunner память. Т.е. играю, выигрываю/проигрываю, оно в любом случае пишет "O WINS", жму N и просто новая игра. Память всё та же. С точность до кб.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: OpenGL

Сообщение Alxn1 »

BratSinot писал(а):
26.04.2010 20:55
Просто fprintf выделяет буфер для внутренних нужд, а потом free не отдает его системе, а оставляет во внутреннем кэшэ. Это нормально. Если я прав - то там незначительно должно потребление памяти увеличиваться каждый раз. Максимум на килобайт-два.

Нет, не прав. В простой SDL версии все нормально.


Ну, прошу прощения, это единственное, что я смог придумать :)

BratSinot писал(а):
26.04.2010 20:55
У меня каждый кадр заново не рисуется. У меня если что-то нарисовалось, оно второй раз не рисуется.


А это неправильно в случае OpenGL. Особенно с учетом двойной буферизации.

В общем, забейте на эту мелочь, если что-то и течет, то не у вас. :)
Спасибо сказали: