Главная » 2D графика » Способы хранение графики в играх и бизнес приложениях

RSS

Способы хранение графики в играх и бизнес приложениях

Не нравитсяНравится   Рейтинг 0

«Загрузчик»

Надеюсь с созданием формата данных для хранения информации Вы разобрались, теперь осталась самая легкая часть – написать загрузчик графики из нашего формата. Как и с компилятором ресурсов, я напишу программу используя VCL (ну не знает наш народ API, а при виде одного dpr файла впадает в ступор – «А где же форма ? Где мой любимы TButton.OnClick ???»=) ).

Всё действо будет происходить в одной процедуре. Параметр ResourceFileName – путь и имя к файлу, а ImageCount – номер изображения для загрузки (нумерация начинается с 1). В процедуре нам понадобится всего четыре переменные:

1
2
3
4
5
6
procedure TLoaderForm.LoadBitmap(const ResourceFileName: string; const ImageCount:integer);
var
  FileStream : TStream;
  Bitmap : TBitmap;
  GameRusourceHeader: TGameRusourceHeader;
  GameResourceTable : TGameResourceTable;

Сама процедура чрезвычайно проста, обратите внимание только на получение смещение для загрузки файла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Инициализация
Bitmap:=TBitmap.Create;
FileStream:=TFileStream.Create(ResourceFileName, fmOpenRead);
// Чтение заголовка
FileStream.ReadBuffer(GameRusourceHeader, SizeOf(GameRusourceHeader));
// Перемещение на начало таблицы смещений ресурса
FileStream.Seek((ImageCount-1)*SizeOf(GameResourceTable), soFromCurrent);
// Чтение таблицы ресурса
FileStream.ReadBuffer(GameResourceTable, SizeOf(GameResourceTable));
// Перемещение к началу данных затребованного ресурса
FileStream.Seek(GameResourceTable.Offset, soFromBeginning);
// Непосредственная загрузка
Bitmap.LoadFromStream(FileStream);
...
// Убираем за собой
Bitmap.Free;
FileStream.Free;

Процедура работает практически мгновенно, я имею в виду перемещение по файлу, а за скорость загрузки самого изображения ответственность ложится на метод LoadFromStream. Возможно, я приложу к статье пример, показывающий, как можно избежать использования TBitmap и загружать ресурс самостоятельно. Хотя это совсем не сложно сделать объединив материал предыдущей статьи и приведенный выше код.

Остановимся на возможности оптимизации. Итак:

1. Первая возможность оптимизации заключается в кэшировании таблицы смещений. Такая структура занимает не очень много места в памяти, но позволит совершить мгновенный переход не только по индексу изображения (что не удобно), но и по его имени, если оно конечно хранится.
2. Вторая – использование собственного загрузчика изображений. Это позволит выиграть очень много времени, особенно если использовать оптимизированные процедуры для загрузки 8 и 24-х битных изображений.

Защищенность ресурса от просмотра ниже средней – простой человек не посмотрит, а для программиста средней руки разобрать такой формат раз плюнуть. Но захочет ли он с этим возится?

Страницы : 1 2 3 4