Форум: "Игры";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
ВнизПроблем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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.043 c