Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.067 c
3-1177508561
DelphiLexx
2007-04-25 17:42
2007.08.12
DBGrid и опция dgEditing


2-1184832133
Combo
2007-07-19 12:02
2007.08.12
Как изменить пароль на Access?


2-1184713012
Dr. Andrew
2007-07-18 02:56
2007.08.12
Как разбить длинную сроку на короткие по заданной длине строки?


15-1184223707
Jeer
2007-07-12 11:01
2007.08.12
Положительные стороны демократии from USA


15-1184232418
boriskb
2007-07-12 13:26
2007.08.12
Ничего лучшего, чем "Офигеть!!!" придумать не могу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский