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

glDeleteBuffers() и glDeleteTextures() не освобождают память (upd.: освобождают; опечатка - два одинаковых индекса, дважды создавался VAO, а удалялся только один) (4 стр)

Страницы: 1 2 3 4
#45
21:18, 20 мар. 2018

Роман Шувалов
> Чисто.
Ну простой пример из 3 строчек "создать заполнить удалить" не течет?

#46
21:34, 20 мар. 2018

Vlad2001_MFS
> VAO может объединять несколько VBO.
Ок, приму к сведению, но в моем случае это пока не нужно.

MrShoor
> Убедись, что код с glDeleteVertexArrays вообще вызывается,
Убедился.

MrShoor
> Еще не красиво выглядит, что у тебя не зануляются дескрипторы:
Там в конце объект уничтожается. Вернее, выставляется status = 0. А при создании нового все заполняется нулями.

MrShoor
> Ну и наконец включен ли Break On OpenGL Errors и Break On Detected Errors в CodeXL?
Запустил сейчас последнюю версию - на выходе виснет и приложение, и CodeXL. Сейчас попробую в Windows.

foxes
> Ну простой пример из 3 строчек "создать заполнить удалить" не течет?
Сейчас испытаю. Но вообще, если отключить VAO (контекст OpenGL 2.1), то ничего не течёт. То есть утечка именно в местах, обёрнутых в

if (VaoEnabled) { 
    // ...
}
#47
22:06, 20 мар. 2018

MrShoor
Утечки статические, т.е. не зависят от моих тестов. Они где-то на этапе загрузки приложения, даже если после загрузки меню сразу закрою - утечек столько же, так что они к делу не относятся.

foxes
> Ну простой пример из 3 строчек "создать заполнить удалить" не течет?
Не течёт :) Но ведь без VAO вообще ничего не течёт, а код внутри скобок if (VaoEnabled) { ... } только содержит только вызовы gl*, которые на простом тесте не дают текучки. Я в замешательстве.

#48
22:27, 20 мар. 2018

Ну не знаю, скажи ему что он плАхой вдруг заработает.

#49
23:46, 20 мар. 2018

В общем, если просто создать и удалить VAO+VBO, утечек нет.
А если в процессе создания-удаления нескольких сотен VAO+VBO заниматься чем-то еще, что занимает память, то VAO уже не удаляется.
Повреждение памяти было бы заметно, тем более в режиме OpenGL 2.1 без VAO всё работает чётко.

Похоже, единственный способ найти - комментировать всё подряд вплоть до заведомо рабочего состояния "создать-удалить".

#50
0:01, 21 мар. 2018

Роман Шувалов
> то VAO уже не удаляется.
Заведи глобальный счетчик сразу после вызова:

glCreateVertexArrays()
gvVAOCount++;
И после удаления:
glDeleteVertexArrays()
gvVAOCount--;
А после удаления контекста выведи этот счетчик:
cout<<gvVAOCount<<"\n";
и посмотри чему он равен.
#51
0:16, 21 мар. 2018

Нашёл! На некоторых шейдерах создание и сразу же удаление даёт утечку! Я тестировал на нескольких случайных, а сейчас скопировал тот список шейдеров, который реально используется. Сейчас буду поштучно вычеркивать по одному и найду засранца.

#52
0:19, 21 мар. 2018

MrShoor
Я же написал выше -
О_О я не отправил предыдущее сообщение что ли... именно так я и поступил. Там ноль. (Ну, не ноль, а то, что после первоначальной загрузки осталось.)

#53
0:27, 21 мар. 2018
#define GAME_SH_SHADOW_OBJ        (RS_SH_USER + 36)
#define GAME_SH_TRANSPARENT_SHADOW_OBJ        (RS_SH_USER + 36)

Дело закрыто.

#54
8:23, 21 мар. 2018

Зато ты узнал немного больше о VAO.

#55
8:40, 21 мар. 2018

вы изобрели refcounters? гениально :)

#56
10:04, 21 мар. 2018

innuendo
> вы изобрели refcounters? гениально :)
Мне нужен был список из констант, если в Си есть лёгкий способ их автоматического инкрементального объявления, дайте знать.

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

#57
11:56, 21 мар. 2018

Роман Шувалов
> Мне нужен был список из констант, если в Си есть лёгкий способ их
> автоматического инкрементального объявления, дайте знать.
enum

#58
12:56, 21 мар. 2018

Bowman
> enum

Изображение
Страницы: 1 2 3 4
ПрограммированиеФорумГрафика

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