О чем никогда не скажут на презентациях Apple

Редкие обладатели Mac отметили, что Allstars, да и LoD, в принципе, тоже, запустить не получается. Как только игра должна уйти в экран загрузки, следует мгновенный вылет. Долгое время я не знал причин такого поведения, но, к счастью, на просторах модмейкинга нашлись люди, которые досконально исследовали проблему и выяснили о ней всё. Здесь — о том, почему фрог поддерживает Mac, а мы — нет.


Немного механики

Mac создавался отдельно от Windows, поэтому некоторые функции, общие для обеих систем, могут работать по разным принципам. И всё бы ничего, но эти мелочи реализации становятся особо болезненны, когда речь заходит о хардкорном программировании — а именно в этом стиле написан WC3.

В стремлении сделать игру быстрее и избавить процессор от лишних вычислений не все внутренние функции были оборудованы защитой от некорректных параметров. Скорее, это было даже простой спешкой, чем оптимизацией, но тем не менее. Например, модерам WC3 хорошо известно, что деформации земли отвратно поддерживаются Mac-системами и часто приводят к вылету игры на них. Почему? Мы вряд ли узнаем.

Проблема размера



Как я уже писал когда-то, мы упираемся в лимит в 8 Мб на карту. В это пространство нужно уложить всё, начиная от картинок скилов и заканчивая моделями. Поэтому каждый файл, который попадает внутрь, проходит оптимизацию. Локи лично выдирал из файлов лишние килобайты, пока те кричали и корчились в муках. Короче, веселый процесс.

И как раз в процессе оптимизации кроется проблема — Mac работает с основным форматом графики более дотошно, чем Windows. Продвигаемый в свое время Джобсом продукт при первой же проблеме валит процесс, а детище Гейтса — вполне спокойно делает исключение и продолжает работу.

Детальный разбор

Каждый .blp файл представляет собой склейку из x слоев размером 1х1, 2х2, 4х4, 8х8 и т.д. по степеням двойки. Эти слои зовутся mipmap.

MIP-маппинг — метод текстурирования, использующий несколько копий одной текстуры с разной детализацией.
Wikipedia

Как видно в спецификации, слоёв — много. Хранить их накладно — особенно если они на самом деле никогда не используются. Например, можно положить камеру на землю, и только в этом случае дистанция будет достаточной, чтобы выбрать для далекого юнита текстуру меньшего разрешения. А в случае иконок эти доп. слои вообще никогда не используются — они стабильно 64х64, за исключением, может, тех случаев, когда игра идет на совсем низком разрешении и подбираются слои 32х32.

Слои с текстурой до 16х16 не представляют вообще никакой ценности, если речь о больших текстурах — то от 128 и ниже. Поэтому от них нужно избавляться, чтобы они не кушали лишнего. Этот процесс возможен и прекрасно работает на Windows — в ссылке на ненужный слой подставляется ссылка на другой, уже ранее объявленный, слой, например, с 16х16 перенаправляет на 32х32. При этом никакой информации в файле о слоях 16х16 и ниже не остается — только ссылки на другие слои. Такие «пустые» слои называют ложными.

Но на Mac этот хак уже не работает. По какой-то причине процессор более заинтересован отсутствующими слоями и валит процесс. Скорее всего, игра просто лезет в некорректный адрес памяти из-за переполнения буфера, который ждет картинку 16х16, а получает 32х32. Но свечку не держал и в реверс не игрался.

Что делать?

Есть два варианта решения проблемы. Первый — не использовать ложные слои. Второй — использовать кодирование в формате палитры, когда изображение не пережимается в JPEG, а читается как сплошной поток данных. Третий — использовать другой формат для графики, например — tga.

1. Без ложных слоев
Каждый слой потребляет место. Может, оно и не шибко заметно в единичном случае, но в карте — более тысячи импортированных файлов. Большие текстуры становятся в разы тяжелее.

2. Палитра
Палитра не так плоха, как кажется. Она хорошо сжимается средствами игры, пусть и теряет при этом в качестве. Но вот большие текстуры ей не создать — для 512х512 текстуры размер уходит за 0.6 Мб, а таких файлов несколько. При сжатии они занимают в 5-6 раз больше места, чем в прежнем состоянии, и даже сама игра их воспринимает как-то странно. В моем случае — просто не видела их.

3. TGA
Хороший формат, как BMP. Но проблема в том, что он хранит излишние данные и никак их не сжимает. Каждая картинка 64х64 превращается в 16 Кб, которые сжимаются от слова «плохо». Про большие текстуры даже говорить не хочется, они уходят в мегабайты.

Практика

Попытавшись пережать оптимизированные ранее изображения, у меня вышли следующие результаты:
Без ложных слоев + палитра, в зависимости от размера текстур:
Исправлено: 150 файлов из 160 с небольшим
Вес карты: с 7.2 до 8.5 Мб
Результат: провал, карту невозможно хостить.

TGA:
Исправлено: 69 файлов
Вес карты: с 7.2 до 7.9 мб
Дальнейшие тесты смысла не имеют, т.к. тоже выйдет за рамки 8 Мб.

Вывод

Фрог поддерживает Mac ценой того, что не может двинуться ни в одну сторону. Новые модели? Нет. Новые иконки? Нет. Вообще никуда. Он совсем намертво заклинился в 8 Мб.

Мы, в свою очередь, расчистили место под что-то более новое и актуальное, однако поддержать Mac не позволит даже созданная поляна — слишком тяжело бремя совместимости.

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

До тех пор играть на Mac стоит либо в режиме Windows-эмуляции на виртуальной машине, либо вот так:



Других выходов пока не предвидится.

14 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.