Помощь Регистрация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 25 из 35
  1. #1
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности

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

    Уж не знаю, куда еще обратиться... Инет весь перекопал - решения проблемы не нашел.

    Есть функция на 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) появляются глюки на изображении.

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

  2. #2
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Выделяй память вне этой функции и передавай ссылку на выделенную память.
    Что за дебильный езык блин((

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

  3. #3
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    В том-то как раз и дело, что пробовал оба варианта - начинаются глюки на картинке.
    А в OpenGL я практически ни черта не понимаю.
    Вот и ищу кого-ндь, кто бы объяснил, как это работает.
    Времени нет...

  4. #4
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    В том-то как раз и дело, что пробовал оба варианта - начинаются глюки на картинке.
    А в OpenGL я практически ни черта не понимаю.
    Вот и ищу кого-ндь, кто бы объяснил, как это работает.
    Времени нет...
    Какого рода глюки?
    Глюки даже если статический массив глобальный используешь и передаёшь его по ссылке? Вот не верю!

  5. #5
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Глюки в виде несвязанных отрезков или какие?

  6. #6
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Максимум, что получается - нормальная картинка, но съезжают координаты.
    Может, в аське?.. 112335254

  7. #7
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    То есть:

    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;

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

  8. #8
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    coords : PTVector это на самом деле GLdouble coords[3], что на самом деле double coords[3]

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

  9. #9
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    То есть:

    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 дабла..

  10. #10
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Цитата Сообщение от Nusferatus Посмотреть сообщение
    coords : PTVector это на самом деле GLdouble coords[3], что на самом деле double coords[3]
    Не факт. Там могут передаваться координаты и цвет.
    Вот: http://publib.boulder.ibm.com/infoce...ssCallback.htm
    Смотри GLU_TESS_COMBINE

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

  11. #11
    AG Team Аватар для Pest
    Регистрация
    04.04.2007
    Пол
    Пол: Мужской
    Авто
    GT Avalanche 2.0
    Возраст
    34
    Сообщений
    3 366
    Благодарности
    Записей в дневнике
    12
    Цитата Сообщение от Nusferatus Посмотреть сообщение
    Array должен быть размерностью 3 дабла..
    тоже заметил. с другой стороны может у него 5-мерное пространство.
    Есть те, кто несут хаос и разрушение, есть те, чья ноша - добро и любовь.
    Есть и третьи, что несут порядок и справедливость. И есть я. Я несу пакетик.

  12. #12
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    Не факт. Там могут передаваться координаты и цвет.
    Вот: http://publib.boulder.ibm.com/infoce...ssCallback.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 );

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

  13. #13
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Да, на входе - 3 x Double.
    А на выходе (outData) - 6 x Double

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

  14. #14
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от Nusferatus Посмотреть сообщение
    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 );

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

  15. #15
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Но вопрос не в этом.
    Там тупо передаются координаты из одного места в другое.
    И вот в чем загадка: почему при выделении памяти под переменную они передаются правильно, а при задании массива - нет?

    То есть, по этой же ссылке (см.выше):
    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...

  16. #16
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Нигде память выделенная не освобождается, см:
    http://www.progz.ru/forum/index.php?showtopic=40804
    Значит нужно искать не здесь, значит за это рулит тут gluTessCallback

  17. #17
    Аватар для SerXio
    Регистрация
    21.04.2009
    Пол
    Пол: Мужской
    Сообщений
    1 436
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    Выделяется память для vertex, потом не освобождается.
    Почему память должна освобождаться если vertex присваиваете переменной dataout и возвращаете из метода? Если сделать FreeMem для vertex удалятся возвращаемые данные.

  18. #18
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Зарегистрированная функция обратного вызова должна зарезервировать память для новой вершины, произвести взвешенную интерполяцию данных с использованием vertex_dataи weight и возвратить указатель на новую вершину в аргументе data_out.
    То есть трабл не здесь искать надо.
    Цитата Сообщение от SerXio Посмотреть сообщение
    Почему память должна освобождаться если vertex присваиваете переменной dataout и возвращаете из метода? Если сделать FreeMem для vertex удалятся возвращаемые данные.
    Она полюбому гдето и чем-то должна высвобождаться, dataout`у присваивается ссылка с погонялом vertex на выделенную память.

  19. #19
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Цитата Сообщение от SerXio Посмотреть сообщение
    Почему память должна освобождаться если vertex присваиваете переменной dataout и возвращаете из метода? Если сделать FreeMem для vertex удалятся возвращаемые данные.
    В dataout передается ссылка на переменную vertex.
    То есть, переменная есть, под нее выделяется память (GetMem), точнее, создается динамическая переменная. Но впоследствии эта переменная не удаляется, и память не высвобождается.

  20. #20
    Аватар для SerXio
    Регистрация
    21.04.2009
    Пол
    Пол: Мужской
    Сообщений
    1 436
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    То есть, переменная есть, под нее выделяется память (GetMem), точнее, создается динамическая переменная. Но впоследствии эта переменная не удаляется, и память не высвобождается.
    Когда в последствии?

  21. #21
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    В dataout передается ссылка на переменную vertex.
    То есть, переменная есть, под нее выделяется память (GetMem), точнее, создается динамическая переменная. Но впоследствии эта переменная не удаляется, и память не высвобождается.
    Стас, я всётаки голосую, что трабл не здесь, а за очистку этой памяти отвечает функция OpenGL, т.к. в офф.мануале о необходимости очтистки выделяемой памяти юзером - нислова и все примеры аналогичные.

  22. #22
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от SerXio Посмотреть сообщение
    Когда в последствии?
    До следующего момента вызова этой же функции.

  23. #23
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Цитата Сообщение от SerXio Посмотреть сообщение
    Когда в последствии?
    Вот в этом как раз и проблема - в процедуре, которая выделяет память под эту переменную, удалять ее нельзя, т.к. эти данные используются после вызова процедуры

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

  24. #24
    Аватар для Stas_K
    Регистрация
    24.01.2006
    Пол
    Пол: Мужской
    Авто
    Chevrolet Cruze
    Возраст
    41
    Сообщений
    934
    Благодарности
    Щас попробую запустить без этой функции...
    Прорисовка изображения вызывается несколько тысяч раз - память отъедается капитально.

  25. #25
    Аватар для Nusferatus
    Регистрация
    01.12.2006
    Пол
    Пол: Мужской
    Авто
    BMW m3
    Сообщений
    39 637
    Благодарности
    Цитата Сообщение от Stas_K Посмотреть сообщение
    Да, про очистку ничего не сказано. Однако же, именно в прорисовке изображения дело. Пытался отключить прорисовку - память перестает "утекать".
    Цитата Сообщение от Stas_K Посмотреть сообщение
    Щас попробую запустить без этой функции...
    Прорисовка изображения вызывается несколько тысяч раз - память отъедается капитально.
    А как работает функция display? Что там? Таймер?
    ЗЫ. Двойная буферизация используется?(В структуре PIXELFORMATDESCRIPTOR указано)

Страница 1 из 2 12 ПоследняяПоследняя
Похожие темы
  1. Есть специалисты по швейным машинам? Нужен совет.
    от W-109 в разделе Полезно. Интересно. Познавательно
    Ответов: 0
    Последнее сообщение: 02.05.2013, 14:12
  2. Есть владельцы '92 Toyota Camry SV30 1.8 AT? Нужен совет!
    от lecorbusier в разделе Саратовский клуб любителей японских автомобилей
    Ответов: 15
    Последнее сообщение: 22.11.2012, 17:29
  3. Есть владельцы '92 Toyota Camry SV30 1.8 AT? Нужен совет!
    от lecorbusier в разделе Автомобильный
    Ответов: 7
    Последнее сообщение: 11.11.2012, 13:05
  4. Есть на форуме музыканты? Нужен совет
    от Марлин в разделе Кино, театры, музыка, искусство, литература
    Ответов: 17
    Последнее сообщение: 01.11.2011, 11:53
  5. Ответов: 6
    Последнее сообщение: 09.01.2011, 17:59
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •