Формат снимков в кэше GE 5.1 и выше
Последнее изменение: 02/06/2020 13:36:32Как известно, снимки отображаемые клиентом приходят из интернета в JPG формате (в закриптованном виде). В том же самом виде они сохранялись и в кэше клиента. Но начиная с клиентов версии 5.1 и выше, вместо jpg в кэш начало попадать что-то неизвестное. Причём, в зависимости от настроек клиента в кэш могли по прежнему попадать снимки и в jpg формате. Что же произошло? А произошёл очередной виток оптимизации клиента.
Начну, казалось бы, издалека: в настройках клиента есть несколько опций, позволяющих регулировать качество отображаемых снимков и соответственно быстродействие клиента при их отображении. Это блоки опций: Цвета текстур, Анизотропная фильтрация, Графический режим, Сглаживание цветов (вкладка 3D-просмотр в настройках клиента).
Т.е. нам предлагается выбрать, что для нас важнее: скорость работы клиента или качественное отображение снимков. По-умолчанию настройки вроде как должны быть установлены на сбалансированный режим, но они скорее установлены на скорость, нежели на качество.
Начиная с клиентов версии 5.1 и выше, блок опций Цвета текстур (а конкретно опция Сжать) стал влиять и на формат снимков в кэше. Дело в том, что полученный из интернета jpg проходит по-этапную обработку, в процессе которой он превращается в текстуру, готовую для наложения на 3D модель. Причём, формат/размер текстуры сильно зависит от указанных опций (и соответственно количество необходимых этапов преобразования). К примеру, текстура тайла в 32-х битном цвете (4 байта на пиксель) имеет размер ~256 кБайт, а при включении опции Сжать, текстура подвергается компрессии и её размер становится равным всего 32 кБайт. Получается 8-ми кратное сжатие, а соответственно увеличивается скорость отображения и количество одномоментно загружаемых в память текстур. Но есть и обратная сторона медали - сжатие происходит с потерями, т.е. качество отображаемой текстуры хоть и не сильно, но уменьшается по сравнению с исходным jpg-ом.
Так вот, при включённой опции Сжать блока Цвета текстур гугловцы решили писать в кэш не исходный jpg, а уже подготовленную, сжатую текстуру. Таким образом, при последующем чтении из кэша данного тайла уже нет необходимости совершать цепочку преобразований форматов, а сразу использовать готовую текстуру.
Текстуры в кэше GE имеют формат очень похожий на DDS (стандартный формат текстур DirectX) в которых применяется сжатие DXT1. Но есть существенные отличия:
- У текстур GE свой заголовок абсолютно не похожий на DDS
- Зеркальный порядок строк (аналогично формату BMP)
Текстура может быть описана следующим образом:
- type
- TGETexture = packed record
- GE_HEAD : TGE_HEAD; // заголовок
- DXT1 : array [0..63, 0..63] of TDXT1; // массив 64*64 элемента
- end;
Заголовок:
- type
- TGE_HEAD = packed record
- Magic : LongWord; // 4F 82 A3 31;
- Xrez : LongWord; // разрешение по горизонтали = 256
- Yrez : LongWord; // разрешение по вертикали = 256
- Unk1 : LongWord; // ?
- Unk2 : int64; // ? всегда равно 7F FF FF FF FF FF FF FF
- end;
Элемент DXT1-массива описывает 16 реальных пикселей (блок 4*4 pix):
- type
- TDXT1 = packed record
- Color0 : word; // опорный цвет #1
- Color1 : word; // опорный цвет #2
- BitMask : LongWord; // маска соответствия пикселя цвету
- end;
Утилита для просмотра гугловских текстур: GE_ImgView.7z (220.37 kB) и её исходники: GE_ImgView_src.7z (17.29 kB).
Полезно будет также ознакомиться с топиком SASGIS.ru: Формат снимков в кэше GE 5.1.3533.1731
И для общего понимания алгоритма компресси/декомпрессии текструр: Технология сжатия текстур S3TC