Есть программеры, знающие OpenGL? Нужен совет.

  • Автор темы Stas_K
  • Дата начала
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
В dataout передается ссылка на переменную vertex.
То есть, переменная есть, под нее выделяется память (GetMem), точнее, создается динамическая переменная. Но впоследствии эта переменная не удаляется, и память не высвобождается.
Стас, я всётаки голосую, что трабл не здесь, а за очистку этой памяти отвечает функция OpenGL, т.к. в офф.мануале о необходимости очтистки выделяемой памяти юзером - нислова и все примеры аналогичные.
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Когда в последствии?

Вот в этом как раз и проблема - в процедуре, которая выделяет память под эту переменную, удалять ее нельзя, т.к. эти данные используются после вызова процедуры :)

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

Да, про очистку ничего не сказано. Однако же, именно в прорисовке изображения дело. Пытался отключить прорисовку - память перестает "утекать".
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Щас попробую запустить без этой функции...
Прорисовка изображения вызывается несколько тысяч раз - память отъедается капитально.
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Да, про очистку ничего не сказано. Однако же, именно в прорисовке изображения дело. Пытался отключить прорисовку - память перестает "утекать".

Щас попробую запустить без этой функции...
Прорисовка изображения вызывается несколько тысяч раз - память отъедается капитально.
А как работает функция display? Что там? Таймер?
ЗЫ. Двойная буферизация используется?(В структуре PIXELFORMATDESCRIPTOR указано)
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Отключил вызов этой callback-функции. Прогнал прорисовку 800 раз - память отъедаться перестала.
 
Ф

Федор

Guest
Заранее извиняюсь, с OpenGL совсем не знаком, но все-же:

Может быть, проблемы в разных менеджерах памяти? У Борланда есть свой, довольно быстрый, менеджер памяти, он используется при вызове дельфовой функции GetМем. Может быть, библиотека OpenGL о нем ничего не знает и пытается освободить память, используя стандартный системный менеджер памяти, т.е. освободить память, которую и не выделяли.

А этот пример и не должен работать:
То есть:

procedure combineCallback(coords : PTVector; data : PTArray4D;
weight : TArray4F; var dataout : Pointer); stdcall;
var
vert:Array [0..5] Of Double;
begin
vert[0] := coords[0];
vert[1] := coords[1];
vert[2] := coords[2];
dataOut := @vert;
end;

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

В примере на C++ используется функция new_vertex(), может быть, нужно и здесь использовать ее, чтобы выделение памяти шло совместимым с OpenGL методом?
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Почитал листинг, два вопроса:
1) Много ли памяти съедает?
2) Отключение тесселятора сильно ухудшает изображение?

2Федор кстати логично, я не знаю как там борланд работает с выделением-очисткой памяти, поэтому хз, может быть. Хотя OpenGL кроссплатформенная библиотека, но функции тянутся из одних и тех же длл, т.е. механизм очистки памяти вполне может ен совпадать с идеологией борланда.
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
тут массив vert создается на стеке и затирается произвольными данными сразу после выхода из процедуры combineCallback, поэтому картинка может быть весьма причудливая.

Согласен, чушь сморозил.

В примере на C++ используется функция new_vertex(), может быть, нужно и здесь использовать ее, чтобы выделение памяти шло совместимым с OpenGL методом?

Может быть. Покопаю в эту сторону.

Почитал листинг, два вопроса:
1) Много ли памяти съедает?
2) Отключение тесселятора сильно ухудшает изображение?

При прогоне в 30 тыс. раз лопает около 500 мегов.
Отключать нельзя - появляется "гребенка".
 
SerXio

SerXio

Участник
Регистрация
21.04.2009
Сообщения
1 432
Реакции
14
Баллы
38
А если сделать так:

объявить vertex : PTVector глобальной переменной

тогда метод будет выглядеть так

procedure combineCallback(coords : PTVector; data : PTArray4D;
weight : TArray4F; var dataout : Pointer); stdcall;
begin
GetMem (vertex, SizeOf (TVector));
vertex^[0] := coords[0];
vertex^[1] := coords[1];
vertex^[2] := coords[2];
dataOut := vertex;
end;

В основном коде очищать:
gluTessCallback(Tess, GLU_TESS_COMBINE, @combineCallback);
FreeMem(vertex);

У Борланда есть свой, довольно быстрый, менеджер памяти, он используется при вызове дельфовой функции GetМем. Может быть, библиотека OpenGL о нем ничего не знает и пытается освободить память, используя стандартный системный менеджер памяти, т.е. освободить память, которую и не выделяли.
Менеджер хоть быстрый, но корявый. Память "протекает" постоянно. И они это до сих пор не исправили.
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Проблему решил фрилансер на 400руб.

Собственно решение:

- создается глобальная переменная: tmp: array of Pointer;

- в callback-процедуре, после всех действий:
if tmp = nil then SetLength(tmp, 1);
tmp[Length(tmp) - 1] := vertex;
SetLength(tmp, Length(tmp)+1);

- в конце всей функции прорисовки:
for marker := 0 to Length(tmp)-1 do FreeMem(tmp[marker]);
tmp := nil;
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
В основном коде очищать:
Ну я так и предлагал - сделать глобальным массив.
Только очистку делать имхо надо после отрисовки, т.е. после glEnd();, а не после вызова калбэк процедуры.
2Stas_K попробуй, паидее должно сработать. Вместо этой камасутры с хранением индексов.
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Ане, не прокатит - всё прально фрилансер сделал.
Там по коду за одно построение сцены - эта функция вызывается дофига и больше раз с разными точками, т.е. память нуна выделять под каждую.
Мона выделить сразу в глобальном массиве память под все, после чего заполнять данный массив, примерно как и сделал фрилансер, тока он сделал чуть иначе- массив запоминает индекс выделенной памяти в массив индексов и длинну сегмента, затем пробегая по нему, очищает память по индексам, хранящимся в данном масиве, как я понял.
Граждане, переходите на СИ! :LOL:
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Мона выделить сразу в глобальном массиве память под все, после чего заполнять данный массив
А сколько памяти выделять? Заранее-то не известно, сколько точек будет обрабатываться...


Граждане, переходите на СИ! :LOL:
Пробовал, не получилось. Хотя, по сути, все одно и то же.
Мне в свое время дали азы Паскаля, а дальше я уж сам, по мере необходимости копался. Достаточно долго копался.
Сейчас некогда новый язык изучать.
 
Верх Низ