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

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

Stas_K

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

Есть функция на Delphi, прорисовывающая объект. На входе – кривая Безье, на выходе – картинка.
Функцию делал фрилансер, получил оплату, теперь не хочет править.
При частом вызове функции приложением отъедается память.
Место, в котором косяк, я нашел – callback-функция, обрабатывающая пересечения:

procedure combineCallback(coords : PTVector; data : PTArray4D;
weight : TArray4F; var dataout : Pointer); stdcall;
var
vertex : PTVector;
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);

Выделяется память для vertex, потом не освобождается.
При попытке поставить в конце функции FreeMem(vertex) появляются глюки на изображении.

Как исправить?
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Выделяй память вне этой функции и передавай ссылку на выделенную память.
Что за дебильный езык блин((

Знание ОпенГЛа тут нипричём, трабл в том, что ты память не освобождаешь.
Либо юзай статический массив - это тупее, но без таких вот нюансов.
 
OP
Stas_K

Stas_K

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

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
В том-то как раз и дело, что пробовал оба варианта - начинаются глюки на картинке.
А в OpenGL я практически ни черта не понимаю.
Вот и ищу кого-ндь, кто бы объяснил, как это работает.
Времени нет...
Какого рода глюки?
Глюки даже если статический массив глобальный используешь и передаёшь его по ссылке? Вот не верю!
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Глюки в виде несвязанных отрезков или какие?
 
OP
Stas_K

Stas_K

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

Stas_K

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

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;

По сути - то же самое, но картинка уже другая.
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
coords : PTVector это на самом деле GLdouble coords[3], что на самом деле double coords[3]

А уверен, что здесь утечка?
Просто в офф.мануале такаяже петрушка - выделяется память, но не очищается, т.е. есть маза, что у gluTessCallback свои диструкторы за это отвечают видимо.
Сколько раз это вызывается и как вообще выглядит функция display() ?
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
То есть:

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;

По сути - то же самое, но картинка уже другая.
Array должен быть размерностью 3 дабла..
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
coords : PTVector это на самом деле GLdouble coords[3], что на самом деле double coords[3]

Не факт. Там могут передаваться координаты и цвет.
Вот: http://publib.boulder.ibm.com/infoc...m.aix.opengl/doc/openglrf/gluTessCallback.htm
Смотри GLU_TESS_COMBINE

А уверен, что здесь утечка?
Больше негде. Облазил весь код - это единственное место, где память выделяется, но не высвобождается.
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Не факт. Там могут передаваться координаты и цвет.
Вот: http://publib.boulder.ibm.com/infoc...m.aix.opengl/doc/openglrf/gluTessCallback.htm
Смотри GLU_TESS_COMBINE
The combine callback is called to create a new vertex when the tessellation detects an intersection, or wishes to merge features. The function takes four arguments: an array of three elements each of type GLdouble, an array of four pointers, an array of four elements each of type GLfloat, and a pointer to a pointer. The prototype Is:

void combine( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData );

Я мош канешна читаю не там..
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Да, на входе - 3 x Double.
А на выходе (outData) - 6 x Double

Точнее, ссылка на структуру 6 x Double
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
The combine callback is called to create a new vertex when the tessellation detects an intersection, or wishes to merge features. The function takes four arguments: an array of three elements each of type GLdouble, an array of four pointers, an array of four elements each of type GLfloat, and a pointer to a pointer. The prototype Is:

void combine( GLdouble coords[3], void *vertex_data[4], GLfloat weight[4], void **outData );

Я мош канешна читаю не там..
А блин затупил я. Момент. Беда у меня с чтением паскаля..
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Но вопрос не в этом.
Там тупо передаются координаты из одного места в другое.
И вот в чем загадка: почему при выделении памяти под переменную они передаются правильно, а при задании массива - нет?

То есть, по этой же ссылке (см.выше):
void myCombine( GLdouble coords[3], VERTEX *d[4], GLfloat w[4], VERTEX **dataOut )
{VERTEX *new = new_vertex();

new->x = coords[0];
new->y = coords[1];
new->z = coords[2];
new->r = w[0]*d[0]->r + w[1]*d[1]->r +
w[2]*d[2]->r + w[3]*d[3]->r;
new->g = w[0]*d[0]->g + w[1]*d[1]->g +
w[2]*d[2]->g + w[3]*d[3]->g;
new->b = w[0]*d[0]->b + w[1]*d[1]->b +
w[2]*d[2]->b + w[3]*d[3]->b;
new->a = w[0]*d[0]->a + w[1]*d[1]->a +
w[2]*d[2]->a + w[3]*d[3]->a;
*dataOut = new; }

Даже не 6, а 7 x Double...
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
SerXio

SerXio

Участник
Регистрация
21.04.2009
Сообщения
1 432
Реакции
14
Баллы
38
Выделяется память для vertex, потом не освобождается.
Почему память должна освобождаться если vertex присваиваете переменной dataout и возвращаете из метода? Если сделать FreeMem для vertex удалятся возвращаемые данные.
 
Nusferatus

Nusferatus

Super Moderator
Регистрация
01.12.2006
Сообщения
40 161
Реакции
179
Баллы
63
Зарегистрированная функция обратного вызова должна зарезервировать память для новой вершины, произвести взвешенную интерполяцию данных с использованием vertex_dataи weight и возвратить указатель на новую вершину в аргументе data_out.
То есть трабл не здесь искать надо.
Почему память должна освобождаться если vertex присваиваете переменной dataout и возвращаете из метода? Если сделать FreeMem для vertex удалятся возвращаемые данные.
Она полюбому гдето и чем-то должна высвобождаться, dataout`у присваивается ссылка с погонялом vertex на выделенную память.
 
OP
Stas_K

Stas_K

Участник
Регистрация
24.01.2006
Сообщения
925
Реакции
2
Баллы
18
Почему память должна освобождаться если vertex присваиваете переменной dataout и возвращаете из метода? Если сделать FreeMem для vertex удалятся возвращаемые данные.

В dataout передается ссылка на переменную vertex.
То есть, переменная есть, под нее выделяется память (GetMem), точнее, создается динамическая переменная. Но впоследствии эта переменная не удаляется, и память не высвобождается.
 
SerXio

SerXio

Участник
Регистрация
21.04.2009
Сообщения
1 432
Реакции
14
Баллы
38
То есть, переменная есть, под нее выделяется память (GetMem), точнее, создается динамическая переменная. Но впоследствии эта переменная не удаляется, и память не высвобождается.
Когда в последствии?
 
Верх Низ