Формат снимков в кэше 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, а уже подготовленную, сжатую текстуру. Таким образом, при последующем чтении из кэша данного тайла уже нет необходимости совершать цепочку преобразований форматов, а сразу использовать готовую текстуру.

Image:ge_dxt_off.png

Текстуры в кэше GE имеют формат очень похожий на DDS (стандартный формат текстур DirectX) в которых применяется сжатие DXT1. Но есть существенные отличия:

  1. У текстур GE свой заголовок абсолютно не похожий на DDS
  2. Зеркальный порядок строк (аналогично формату BMP)

Текстура может быть описана следующим образом:

Delphi code
  1. type
  2.   TGETexture = packed record
  3.     GE_HEAD : TGE_HEAD;                      // заголовок
  4.     DXT1    : array [0..63, 0..63] of TDXT1; // массив 64*64 элемента
  5.   end;

Заголовок:

Delphi code
  1. type
  2.   TGE_HEAD = packed record
  3.     Magic : LongWord;                        // 4F 82 A3 31;
  4.     Xrez  : LongWord;                        // разрешение по горизонтали = 256
  5.     Yrez  : LongWord;                        // разрешение по вертикали = 256
  6.     Unk1  : LongWord;                        // ?
  7.     Unk2  : int64;                           // ? всегда равно 7F FF FF FF FF FF FF FF
  8.   end;

Элемент DXT1-массива описывает 16 реальных пикселей (блок 4*4 pix):

Delphi code
  1. type
  2.   TDXT1 = packed record
  3.     Color0  : word;                          // опорный цвет #1
  4.     Color1  : word;                          // опорный цвет #2
  5.     BitMask : LongWord;                      // маска соответствия пикселя цвету
  6.   end;

Утилита для просмотра гугловских текстур: GE_ImgView.7z (220.37 kB) и её исходники: GE_ImgView_src.7z (17.29 kB).

Полезно будет также ознакомиться с топиком SASGIS.ru: Формат снимков в кэше GE 5.1.3533.1731

И для общего понимания алгоритма компресси/декомпрессии текструр: Технология сжатия текстур S3TC