Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Проблемs c памятью   Найти похожие ветки 

 
VitaWED   (2006-09-04 09:47) [0]

Доброго времени суток, уважаемые мастера. Имеетца следующая задача: есть некая поверхность и на нее необходимо наложить всякие разные вычисляемые текстуры. Все в принципе понятно, но есть проблема, при каждом последующем наложении текстуры прога неслабо ест памяти. Исследования показали, что память жрет процедура gltexImage2d. Выглядит это следующим образом:

type
 ptybuff=^tybuff;
 ptybuffa=^tybuffa;
 tybuff=array[1..128000] of record
                             r:byte;
                             g:byte;
                             b:byte;
                           end;
 tybuffa=array[1..128000] of record
                             r:byte;
                             g:byte;
                             b:byte;
                             a:byte;
                           end;
var
 Buffer2b:ptybuff;
 Buffer2:pointer;
 Buffer3b:ptybuffa;
 Buffer3:pointer;
....
begin
....
//Выделяем память под изображение и читаем его
 getmem(buffer2,header.size);
 getmem(buffer3,header.size*4 div 3);
 buffer2b:=ptybuff(buffer2);
 buffer3b:=ptybuffA(buffer3);
 Blockread(f,buffer2^,header.size);
 for i:=1 to header.size div 3 do
 begin
   buffer3b^[i].r:=buffer2b^[i].b;
   buffer3b^[i].g:=buffer2b^[i].g;
   buffer3b^[i].b:=buffer2b^[i].r;
   buffer3b^[i].a:=envblendcolor[3];  
 end;
...
   gltexImage2d (gl_texture_2d,0,4,BMPinfo.width,BMPinfo.height,0,gl_rgba,gl_unsigned_byte,buffe r3); // а здеся при каждом вызове съедается по 4 метра ОЗУ
   FreeMem(buffer3);//Очищаем память
   FreeMem(buffer2);
...
end;

Вопрос: что я делаю неправильно, и как правильно очищать ранее выделенную память при последующем наложении текстур?


 
Rial ©   (2006-09-04 15:54) [1]

1. Сама по себе glTexImage2D безнадежно устарела.
Используй gluBuild2DMipmaps. Как именно импользовать - поищи в инете.

Вместо
glTexImage2D(GL_TEXTURE_2D, 0, 4, Width, Height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, pDataAlpha);


Напиши функцию подготовки, и :
glGenTextures(1, Result);
glBindTexture(GL_TEXTURE_2D, Result);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, Width, Height, GL_RGBA,
GL_UNSIGNED_BYTE, pDataAlpha);


2. Если все же есть какая то необходимость использовать
именно glTexImage2D то готовь все текстуры заренее один раз
с ипспользованием списков (что б им пусто было).
Иначе память будет действительно безбожно съедаться.
Должно получиться что то подобное:

glNewList(Result, GL_COMPILE);
 glTexImage2D(GL_TEXTURE_2D, 0, 4, Width, Height, 0, GL_RGBA,
 GL_UNSIGNED_BYTE, pDataAlpha);
glEndList;

Опять же, это функция.

Естественно, сама подготовка DIB остается прежней.

3. Заинтересовало вот это :
Blockread(f,buffer2^,header.size);
Просто интересно, зачем и почуме так делается ?
Если, насколько я способен предсказать, ты сначал
достаешь DIB из растра и сохраняешь в файл,
а потом читаешь из файла это все добро, то ты не прав.
Процедура получения DIB срботает намного быстрее, чем
загрузка оного из файла, поэтому не надо заморачиваться,
читай сразу Bitmap, или что у тебя там, и получай DIB.
Хотя, возможно, я не понял сути.


 
VitaWED   (2006-09-05 09:12) [2]

1. Ух ты, действительно память почти перестал есть... Правда, почему то прорисовка больших фрагментов стала занимать больше времени (у меня все подложки 2^m*2^n). Но это ладно...
2. Списки никак не помогают
3. Исторически так сложилось, что у меня этот кусок кода использ. Насчет DIB ты прав конечно. Как руки дойдут - переделаю :))


 
Rial ©   (2006-09-05 18:45) [3]

> 2. Списки никак не помогают

Вероятно. Я думал просто, что загружаешь по несколько раз
одну и ту же текстуру.
Не забудь, кстати, удалять созданные с помошью
gluBuild2DMipmaps
текстуры, используя
glDeleteTextures

Кстати, а большие куски действительно рисуются медленее.
Все дело в фильтрации, наверное.

> 3. Исторически так сложилось, что у меня этот кусок кода
> использ

:))



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.031 c
1-1180596113
Victor_Ked
2007-05-31 11:21
2007.08.12
Завершена ли передача файла по сети


15-1184656344
Kolan
2007-07-17 11:12
2007.08.12
Иконка врача есть у кого, нибудь?


9-1157313285
_Razor_
2006-09-03 23:54
2007.08.12
Текстурирование ландшафтов


2-1184491327
>>DEATH<<
2007-07-15 13:22
2007.08.12
сслки из хтмл кода


2-1184730900
Марго
2007-07-18 07:55
2007.08.12
Компонента ShellTreeView