Текущий архив: 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