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

Вниз

Хранение текстур   Найти похожие ветки 

 
akaValerius ©   (2007-02-02 17:16) [0]

Люди предложите какой нибудь не глючный способ хранения текстур. На сцене могут присутствовать приблизительно 30 текс. 256 на 256. и пара 512 на 512.


 
RzCoDer ©   (2007-02-02 17:45) [1]

В видео памяти


 
Леон ©   (2007-02-03 17:15) [2]

П7 где то выкладывал свой менеджер тексиур..
заголовок такой: (может наведет на мысли..)

unit p7_textures;
...
 P7Texture = record
   FileName : string;
   ID : uint;
   Width : uint;
   Height : uint;
   Count : uint;
 end;

 P7TextureManager = class
 private
   Log : PP7Log;
   function  Find( FileName : string ) : int; // тут поиск среди уже загруженных
   procedure LoadBMP( FileName : string; var ID : uint; var Width : uint; var Height : uint );
   procedure LoadTGA( FileName : string; var ID : uint; var Width : uint; var Height : uint );
 public
   Items : array of P7Texture;
   Count : uint;
   Binded : int;
   constructor Create( plog : PP7Log );
   destructor  Destroy;
   function  Add( FileName : string ) : int; // проверка - не загружен ли, и потом подгрузка если нету. Иначе вернуть ID уже подгруженной текстуры
   procedure Bind( tid : uint );
   procedure Del( tid : uint );
 end;


 
@!!ex ©   (2007-02-03 17:58) [3]

Вот такой код юзаю сейчас. Буду рад, если укажите на слабые места.
Textures - Модуль от Хорна, чуть измененный для учета разрешения текстур и фильтров.

unit TextureLib;
interface
uses Textures, OpenGL, SysUtils;

type
 PTextureLib = ^TTextureLib;

 TTexture = record
   Name:string;
   Texture:GLuint;
   Min,Mag:integer;
   Width,Height:integer;
 end;

 TTextureLib = class
 public
   Constructor Create;
   Destructor  Destroy;
   Function    GetTexture(FileName:string; Min:integer = GL_LINEAR_MIPMAP_LINEAR; Mag:integer = GL_LINEAR):GLuint;
   Function    GetWidth(TextureID:integer):integer;
   Function    GetHeight(TextureID:integer):integer;
   Procedure   BindTexture(TextureID:integer);
 protected
   Items:array of TTexture;
   Count:integer;
   Size:integer;
 end;

implementation

constructor TTextureLib.Create;
begin
 Size:=10;
 Count:=0;
 SetLength(Items,Size);
end;

destructor TTextureLib.Destroy;
begin
                                                           
end;

function TTextureLib.GetTexture(FileName: string; Min:integer = GL_LINEAR_MIPMAP_LINEAR; Mag:integer = GL_LINEAR): GLuint;
var
 Index:integer;
begin
 for Index:=0 to Count-1 do
   if (Items[index].Name=FileName) and (Items[index].Min=Min) and (Items[index].Mag=Mag) then begin
     Result:=index;
     Exit;
   end;

 inc(Count);
 if Count>Size then begin
   inc(Size,10);
   SetLength(Items,Size);
 end;

 Items[Count-1].Name:=FileName;
 Items[Count-1].Min:=Min;
 Items[Count-1].Mag:=Mag;
 LoadTexture(FileName,Items[Count-1].Texture, Items[Count-1].Width,Items[Count-1].height, False,Min,Mag);
 Result:=Count-1;//Items[Count-1].Texture;
end;

function TTextureLib.GetWidth(TextureID: integer): integer;
begin
 Result:=Items[TextureID].Width;
end;

function TTextureLib.GetHeight(TextureID: integer): integer;
begin
 Result:=Items[TextureID].Height;
end;

procedure TTextureLib.BindTexture(TextureID: integer);
begin
 glBindTexture(GL_TEXTURE_2D,Items[TextureID].Texture);
end;

end.


 
Rial ©   (2007-02-05 06:35) [4]

> [3] @!!ex ©   (03.02.07 17:58)
> Вот такой код юзаю сейчас. Буду рад, если укажите на слабые
> места.
> Textures - Модуль от Хорна, чуть измененный для учета разрешения
> текстур и фильтров.

Я заранее извиняюсь, я не придираюсь... просто 6 утра, а мне скучно.
Жаль, не знаю, что делает LoadTexture.

1.Вот это:
Inc(Count);
Лучше бы делать в конце, было бы логичнее, и не было бы столько лишний
вычитаний.

2.Странно такое объявление:
destructor Destroy;
Мне кажется, лучше  писать все таки
destructor Destroy; override;
...
destructor TTextureLib.Destroy;
begin
Inherited;                                                            
end;


3.(FileName: string;
Строки лучше передавать через Const,
т.к. строка - структура немного тяжеловесная все таки,
а тут создается лишняя ее копия.

4.Я сам проходил через почти идентичный код.
Поэтому погу сказать, что тут возникнут проблемы при
удалении текстур из- за использования массива.
Оптимальнее, ИМХО, пользоваться списками.
И передавать нужно будет не идентификатор, а указатель
на структуру.

5.Красивее будет выглядеть
With Items[Count-1]

6.Удивило вот это:
for Index:=0 to Count-1 do
  if (Items[index].Name=FileName) and (Items[index].Min=Min) and (Items[index].Mag=Mag) then begin
    Result:=index;
    Exit;
  end;

Странный какой то подход. Дело даже не в том, что при наличии 100 текстур
это операция будет жутко тормозить...
Просто неужели неизвестно заранее, загружена текстура или нет ?
Поддержки удаления нет... очевидно, текстуры никуда не пропадут.
Так грузи их 1 раз - и делов то.

Либо, сделать флаг на более высоком уровне. После загрузки
пиши туда bLoaded:=True; и не грузи еще раз.


 
XProger ©   (2007-02-05 06:48) [5]

@!!ex, минус один - размер исполняемого файла )
Rial, в GetTexture основная нагрузка на этот цикл будет приходиться лишь при 10000 текстурах, если не больше ) Так что ничего страшного нет, да и подгрузка текстур в реальном времени - весьма редкая операция...


 
Rial ©   (2007-02-05 07:01) [6]

> [5] XProger ©   (05.02.07 06:48)

Я в принципе это понимаю. Но говорю же, скучно :)


 
@!!ex ©   (2007-02-05 09:19) [7]


> 1.Вот это:
> Inc(Count);
> Лучше бы делать в конце, было бы логичнее, и не было бы
> столько лишний
> вычитаний.

Знал, что на это обратите внимание, просто так исторически сложилось, для меня такой код понятнее, тем более что по всем проектам так.


> 2.Странно такое объявление:
> destructor Destroy;
> Мне кажется, лучше  писать все таки
> destructor Destroy; override;
> ...
> destructor TTextureLib.Destroy;
> begin
> Inherited;                                              
>              
> end;

Согласен.


> 3.(FileName: string;
> Строки лучше передавать через Const,
> т.к. строка - структура немного тяжеловесная все таки,
> а тут создается лишняя ее копия.

Недоглядел. Стараюсь везде const юзать, здесь видимо тормознул.


> 4.Я сам проходил через почти идентичный код.
> Поэтому погу сказать, что тут возникнут проблемы при
> удалении текстур из- за использования массива.
> Оптимальнее, ИМХО, пользоваться списками.
> И передавать нужно будет не идентификатор, а указатель
> на структуру.

И  какие проблемы? :)
Удаляем текстуру. На ее место переносим информацию о последней текстурке, уменьшаем количество текстур на 1.


> 5.Красивее будет выглядеть
> With Items[Count-1]

Да. Тут скорее сказалась некоторая субъективная неприязнь к with....


> 6.Удивило вот это:
> for Index:=0 to Count-1 do
>   if (Items[index].Name=FileName) and (Items[index].Min=Min)
> and (Items[index].Mag=Mag) then begin
>     Result:=index;
>     Exit;
>   end;
> Странный какой то подход. Дело даже не в том, что при наличии
> 100 текстур
> это операция будет жутко тормозить...
> Просто неужели неизвестно заранее, загружена текстура или
> нет ?
> Поддержки удаления нет... очевидно, текстуры никуда не пропадут.
>
> Так грузи их 1 раз - и делов то.

Да откуда я знаю, загружена текстура или нет? :))
Я даже не знаю какие объекты будут загружены. Не знаю из каких текстур состоят загружаемые объекты, какие текстуры используются в карте, даже не знаю, какие будут заюзаны в HUD"e.


> @!!ex, минус один - размер исполняемого файла )

SysUtils?
Да, знаю. Я использую свой модуль с нескольими необходимыми функциями, а здесь SysUtils подставил, чтобы у народа компилилось.


 
deus krid   (2007-02-13 15:02) [8]


>
> 2.Странно такое объявление:
> destructor Destroy;
> Мне кажется, лучше  писать все таки
> destructor Destroy; override;


и я тоже согласен =), потому как деструктор всегда виртуален и "перетирать" его так нельзя


 
@!!ex ©   (2007-02-13 15:07) [9]


> deus krid   (13.02.07 15:02) [8]

Круто. И к чему это было сказано? :))
Поучиться хочеться?


 
amphest_coder aka deus krid   (2007-02-13 18:03) [10]

(оффтоп)
@!!ex
да просто левая пятка сильно зачесалась, вот и сказанул... просто никто не уточнил, почему же нельзя. вот я думаю, возьму да напишу. это лучше, чем сморознуть чето вроде "пакуй текстуры в списки" и уйти не возвращаясь.


 
Rial ©   (2007-02-13 20:47) [11]

> [8] deus krid   (13.02.07 15:02)
> и я тоже согласен =), потому как деструктор всегда виртуален
> и "перетирать" его так нельзя

Никогда не говори никогда.
Согласен, что наверняка виртуальный деструктор лучше, пока дело
не доходит до критической оптимизации.
Ведь это пара тактов на вызов через виртуальную таблицу и 4 байта
лишний указатель в памяти.


> [10] amphest_coder aka deus krid   (13.02.07 18:03)
> (оффтоп)
> @!!ex
> да просто левая пятка сильно зачесалась, вот и сказанул...
> просто никто не уточнил, почему же нельзя. вот я думаю,
> возьму да напишу. это лучше, чем сморознуть чето вроде "пакуй
> текстуры в списки" и уйти не возвращаясь.

А никто не уточнил, потому как все посчитали это очевидным.
Просто человек забыл написать слово, а ты раздул из этого комедию.

Еще никто не уточнил, что если приведенный код пытаться
скомпилировать в системе Prolog, требуемый результат не будет достигнут.

И что ты аргументировано имеешь против списков ?


 
@!!ex ©   (2007-02-13 20:48) [12]


> amphest_coder aka deus krid   (13.02.07 18:03) [10]

Ок. :)
Я думаю народ в курсе, почему перекрывать нельзя Destroy.


 
amphest_coder aka deus krid   (2007-02-13 23:08) [13]

(офф)
@!!ex
=) вот и ладно



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

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

Наверх




Память: 0.51 MB
Время: 0.019 c
2-1211374275
Vladi78
2008-05-21 16:51
2008.06.15
Вопрос !!!


6-1188888728
Alexey_k
2007-09-04 10:52
2008.06.15
Indy и подсчёт траффика


3-1199992043
Виталий Панасенко(дом)
2008-01-10 22:07
2008.06.15
SQL Server & Co


15-1209988486
БарЛог
2008-05-05 15:54
2008.06.15
Где хранить "корзину" в интернет-магазине?


2-1211531733
Сергей
2008-05-23 12:35
2008.06.15
Есть ли в Delhpi функция, подобная Splin в VB ?