Речь у нас сегодня пойдет о полезных игроразработчику форматах файлов. Точка и три буквы — что они таят?.. За ними могут быть и музыка, и графика, и игровые модели, и какие-то настройки... Да что угодно. Каждый формат полезен по-своему. Однако "три буквы" — это только маска, за которой может скрываться совсем другая сущность. Кто мешает разработчику присвоить файлам с текстурами расширение dat? А игровым звукам приписать графическое расширение jpg? Вот тут уж точно никто не догадается о сущности файла, если только не воспользуется автоматическим сканером ресурсов. Обычно разработчики предъявляют форматам используемых файлов три основных требования. Во-первых, они должны быть удобны и легко доступны как в процессе разработки (то есть в соответствующем редакторе), так и в процессе работы игры (то есть на программном уровне). Во-вторых, все форматы должны иметь хоть какую-то защиту от вскрытия или хотя бы видимость того, что файл защищен.
Вот что бывает при неправильном определении формата. Ладно, если пытливый игрок позарится на игровые звуки, чтобы украсить ими свою операционку. А вдруг пронырливые конкуренты смогут получить доступ к ресурсам? А вдруг... Да что там — спокойнее, если ресурсы будут защищены или замаскированы. И простым переименованием расширения здесь не обойтись. Приходится изобретать собственные форматы файлов, упрятывать игровые ресурсы в хитрые архивы, скрывать их в недрах exe-файла и даже шифровать. Однако, как любит говаривать комрад Геймер, не бывает абсолютной защиты, бывают лишь плохие хакеры. И любой, даже самый хитрый формат будет со временем вскрыт, разложен по полочкам и представлен в неглиже игровой общественности. От этого никуда не деться. Так пусть этот момент настанет как можно позже. Еще одна проблема — место. Все ресурсы должны занимать его как можно меньше. Решается это либо помещением всех ресурсов в компрессированные архивы (которые одновременно будут выполнять функцию защиты), либо компрессированием файлов на уровне форматов. Например, хорошо известный всем avi может храниться в некомпрессированном виде и, как следствие, занимать уйму места. Либо в одном из компрессированных форматов, к которым относится и хорошо вам известный по игроманскому ролику DivX. Если второе и третье требования можно легко выполнить, то с первым сложнее. Любой мало-мальски распространенный формат можно открыть и отредактировать в соответствующем редакторе. Но как внедрить его в игру? С самыми распространенными форматами проблем не будет. Bmp, wav и некомпрессированный avi поддерживает любой язык программирования. Но как быть, например, с компрессированным звуком? По умолчанию ни один API не поддерживает формат mp3. Для его поддержки нужны специальные библиотеки, которые не так сложно достать, но достаточно сложно внедрить. Некоторые форматы файлов коммерческие. Для их использования придется лицензировать кодек или платить за раскодировщик. Еще одна проблема связана с родными русскими реалиями. Не секрет, что начинающему разработчику трудно раскошелиться на профессиональные пакеты для работы с необходимыми форматами файлов. Лицензия на использование 3D Studio MAX стоит больше трех тысяч долларов. А попробуйте без него сваять приличную трехмерную модель! Поэтому русские Кулибины для разработки используют пиратские версии этих пакетов. Пока идет процесс собственно разработки, все хорошо. Но вот когда они захотят выйти со своей игрой на рынок, тем более мировой, начнутся проблемы. Русские издатели к таким вещам относятся менее щепетильно, чем их западные коллеги. В России выпуск игры, разработанной на пиратской коленке, не является большой проблемой. А вот на Западе вас могут спросить, какими инструментами вы пользовались при разработке и каковы их серийные номера. Конечно, картинку, сделанную в Photoshop, можно конвертнуть в формат bmp. Как бы ни рассматривали эту картинку западные эксперты, они не смогут доказать, что она сделана не в Paint. Формат 3ds также является достаточно распространенным, в него экспортируют многие программы. А вот какие-то специфические форматы, например видео bink или smk, не ускользнут от зоркого объектива экспертов, которые привлекут вас по сотне статей за тысячу нарушений авторского права. Как решить эти, а также многие другие проблемы с форматами файлов? Как выбрать оптимальные схемы хранения ресурсов? В этом нелегком деле вам поможет данная статья. Мы рассмотрим наиболее популярные и распространенные среди игроразработчиков форматы файлов и сделаем единственно верный выбор. 3ds Это один из самых распространенных форматов для хранения 3D-графики. Его с успехом экспортируют десятки редакторов и импортируют сотни движков. Изначально файлы формата 3ds были стандартными файлами 3D Studio. В те дремучие времена, когда он еще работал под DOS. Дремучие времена прошли, а вместе с ними стал не нужен и сам формат. Новенький 3D Studio MAX обзавелся псевдообъемным windows-интерфейсом, со всеми присущими ему достоинствами и недостатками. И сменил формат хранения на max. Казалось бы, осиротевший 3ds должен был очутиться на свалке истории. От вечного забытья этот формат спас счастливый случай. По ряду причин новый формат max оказался неудобен для игроразработческих целей. Старичка 3ds откопали из горы мертвых форматов, отряхнули, принарядили и представили публике. И оказалось, что несостоявшийся покойник обладает незаурядными качествами, просто-таки идеально вписывающимися в нужды игроделов. Судите сами: кроме самих трехмерных моделей (которые представляют собой каркасные сетки), он хранит их положения в мировых координатах, координаты текстур, цвета вершин, ключевые кадры анимации, данные о свойствах материалов и даже атмосферные эффекты! Это практически готовый формат для хранения моделей и целых карт. Только скриптовые команды придется хранить отдельно. Корректно загружать файлы этого формата могут и такие распространенные бесплатные движки, как Genesis3D и GLScene. Еще раз обратите внимание на возможность формата 3ds, которую вы, быть может, не заметили. Координаты текстур хранятся в самом файле совместно с моделью. Значит, нет больше мучений с косыми дверьми и лицами на затылках. А что вообще такое эти координаты текстур? Когда в каком-то графическом редакторе вы накладываете на объект текстуру, она "расплывается" по модели. Вполне может быть, что то место, где по идее моделлера должна быть левая нога, будет текстурировано правой ноздрей. И наоборот. Это безобразие легко исправить. В любом редакторе имеются специальные модификаторы для правильного наложения текстур. В одних случаях можно только смасштабировать текстуру и двигать ее по поверхности модели так, как будто она наложена на сферу аналогичных размеров. В других, более продвинутых редакторах, можно на специальной карте-развертке модели указать ключевые точки, к которым будут крепиться соответствующие точки текстуры. К слову, в 3D Studio MAX можно сделать и то, и другое. Привязка ключевых точек модели к соответствующим точкам текстуры и определяет координаты текстур. При этом сами
Когда анимация не ставится во главу угла, лучший формат для хранения людей - md3. координаты задаются двумя действительными числами. При сохранении 3ds-файла можно указать, чтобы координаты текстур сохранялись вместе с моделью. После этой нехитрой операции вы можете не беспокоиться о качестве наложения текстуры в конечной игре. Некоторые отсталые движки не воспринимают 3ds-файлы новых версий. При сохранении моделей для подобных движков необходимо указать, что все полигоны будут разбиты до простейших составляющих, то есть до треугольников. В целом, формат 3ds является очень удобным и практичным для любых видов игровых моделей. Mdl, md2 и md3 Эти три формата предназначены для хранения анимированных моделей, особенно анимированных людей. Многим геймерам эти форматы хорошо знакомы, ведь в них хранятся модели первого, второго и третьего "Квейка" и всех игр на его движке. Например, в недавнем Jedi Knight 2 все игровые персонажи хранились в формате md3. Все три формата открыты. Ими может пользоваться любой желающий. В Сети можно найти массу ресурсов, посвященных моделеваянию под все версии Quake. Это значит, что пару сотен моделей в этих форматах вы при первом поиске наберете. Что собой представляют эти форматы? В них хранятся модели и данные о скелетной анимации. Это не совсем скелетная анимация в привычном смысле этого слова. Анимации моделей хранятся в них как бы по трехмерным кадрам, причем каждому кадру соответствует своя полноценная модель. Размер файлов при этом возрастает пропорционально количеству кадров анимации. Модель средней детализированности и в меру анимированная весит 200-600 кб, что для серьезного игростроения многовато. Предпочтительнее было бы пользоваться форматами с "чистой" скелетной анимацией, если бы не одно "но". Оказывается, форматы md* неплохо сжимаются. Smd А вот в файлах этого формата хранится "честная" скелетная анимация. Это отражается и на размерах получаемых файлов, и на качестве анимации. Первоначально формат использовался для анимации моделей в Half-Life, но позже умельцами был пристроен практически к каждому трехмерному движку. Сам формат чрезвычайно удобен. Неудобна только система хранения файлов. Во-первых, необходим ключевойsmd-файл. В нем хранится сама модель без анимации. Его необходимо загружать в первую очередь. В остальных файлах (один файл на одну анимацию) хранятся анимационные данные о модели. Без ключевой модели и ключевого файла работать они, естественно, не будут. Если вам необходимо высокое качество анимации, используйте этот формат. Bmp (bmp24) Мы заканчиваем знакомство с форматами для хранения трехмерных моделей и переходим к форматам для хранения текстур. Самым простым является bitmap/rle — bmp. Что представляет собой этот формат, знают даже неспециалисты. Это простой битовый массив точек, данные о цвете каждой из которых хранятся в формате RGB (есть красная, зеленая и синяя составляющие) и занимают аккурат 24 бита. К достоинствам bmp можно отнести то, что отредактировать его можно где угодно, начиная от Paint на графическом калькуляторе и кончая Photoshop на рабочей станции. Файлы этого формата очень легко сжимаются. Основной недостаток тоже широко известен — файлы весят не просто много, а жутко много, что для игроразработчика неприемлемо. Почему этот формат не сдают в утиль? Потому что в некоторых случаях без него не обойтись. Большинство его более прогрессивных собратьев при сохранении тем или иным способом изменяют данные об исходном изображении,
Когда качество текстуры не имеет принципиального значения, самый лучший формат - jpg. причем изменяют навсегда. При загрузке не происходит восстановления исходного изображения. В тех нередких случаях, когда необходимо сохранить точные данные об оригинале, применяется формат bmp. А хорошая сжимаемость компенсирует большую величину. Так стоит ли bmp вообще использовать? Еще как стоит. Иначе он не попал бы в наш обзор. Bitmap32 Это сравнительно новый формат, созданный на базе bmp. От своего младшего собрата он отличается тем, что данные об одной точке хранятся не в 24, а в 32 битах. Лишние 8 бит используются для хранения 256 оттенков прозрачности, то есть содержат альфа-канал. Формат еще не получил широкого распространения. Главным образом потому, что редактировать его умеют далеко не все редакторы. Конечно, мэтр Photoshop открывает его только так, но вот остальные... Но у формата большое будущее, особенно после появления Windows XP, где альфа-канал был узаконен на уровне ядра системы (основные конкуренты Windows сделали это еще лет десять назад, но это так, к слову). Постепенно Bitmap32 будет вытеснять обычный bmp. Из движков его поддерживает GLScene. Для разработчика этот формат удобен, прежде всего, из-за хранения дополнительной составляющей прозрачности. Раз эта составляющая хранится внутри файла с текстурой, отпадает необходимость в отдельной карте прозрачности (или непрозрачности, если идти от английского эквивалента). В итоге мы имеем меньше мороки с файлами. Jpeg Один из самых распространенных форматов для хранения текстур. Практически все игры пользуются его возможностями. Неоспоримое преимущество jpeg перед другими форматами для хранения графики — малый размер. Как говорят большие дяди с дипломом PR-менеджера, проведем эксперимент. Возьмем фотографию размером 800х600 в формате bmp и запакуем ее в zip-архив с самой высокой степенью компрессии. Возьмем эту же картинку и переведем ее в формат jpg. Сравним размеры полученных файлов. Jpeg лидирует! Похлопаем, товарищи... Область использования формата jpg имеет некоторые ограничения, связанные с различием в исходном и конечном изображении. Картинка сжимается за счет изменения или устранения каких-то частей, которые человеческий глаз не замечает. В том-то и дело, что не замечает только на плоскости! Будучи наложенной на какую-нибудь косую стену, текстура предстанет перед вами совсем в другом ракурсе, и тогда ваш глаз уже может заметить все огрехи, за счет которых уменьшился размер. Одно из самых ярких негативных проявлений компрессии по методу jpeg — излишняя замыленность изображения. Несмотря ни на что, jpeg активно используется для хранения текстур. Если правильно подойти к конвертации форматов, разница между исходной и получившейся текстурой будет незаметна даже на очень кривой поверхности. Художникам текстур необходимо запомнить одно золотое правило: редактируйте текстуру в открытом формате bmp, и сохраняйте ее в jpg только один-единственный раз. Непосредственно перед экспортом в игру. Если в процессе разработки хранить текстуры в формате jpg, каждый раз при сохранении к уже существующим ошибкам изображения будут добавляться новые. Таким образом, с каждым сохранением текстура будет заметно терять в качестве. Это цена хорошей компрессии. Формат jpeg относительно доступен для любого языка программирования. При открытии текстуры jpg на уровне программного файла проблем не будет. Теоретически... Однако мало кто знает, что jpg — общее определение для целого ряда алгоритмов сжатия. Обычно, когда мы говорим о формате jpg, мы подразумеваем формат jfif,
Тундра. Холст 3ds и кисть tga. Государственный музей современных искусств. основанный на методе сжатия Baseline Sequential DCT. Хотя jpg-файлы другого типа мало распространены, перед конвертацией в графическом редакторе обязательно проверьте, одинаково ли понимают стандарт jpg графический редактор и игровой движок. Вдруг у них на этот счет разные мнения? Tga Формат Targa имеет длинную и богатую историю развития. Корни его восходят к эпохе Amiga и Commodore. Он не состарился со временем, даже наоборот, похорошел и предлагает удобные методы для хранения игровой графики. Tga объединяет в себе самые положительные качества jpg и bitmap32, так как обладает не только поддержкой прозрачности, но и не очень большими размерами. Но поддержки в языках программирования формат почти не получил. Стандартных процедур для работы с tga нет во многих движках. Зато те движки, где этот формат поддерживается, заметно выигрывают из-за приобретения удачного решения для хранения текстур. Tga обращается с исходным изображением не так варварски, как jpeg, а значит, можно получить приемлемое качество, не заботясь об оптимизации. Tga может хранить не только стандартные черно-белые и RGB изображения, но и изображения, основанные на индексной палитре. Они применяются для web-дизайна. В активе формата несколько различных методов сжатия оригинала, а также возможность хранить изображение без сжатия, что порадует любителей фотореалистичных текстур. При этом файлы формата tga сами по себе хорошо сжимаются стандартными средствами, такими как zip и rar. Следовательно, храня tga в архивах, мы получаем двойную выгоду. Курсоры Напоследок рассмотрим еще одну категорию форматов, полезных игроразработчику. Речь идет об игровых курсорах. В качестве курсоров можно применять стандартные механизмы Windows, если только ваша игра не работает через DirectDraw. Почему следует воздерживаться от употребления стандартных курсоров в контексте DirectDraw, детально объяснил в №6 нашего журнала за 2002 год Дядя Федор, и я отсылаю вас к соответствующему выпуску "Горячей линии". А тех, кто остался, попрошу внимания. Существует два основных формата курсоров — cur и ani. Первый отвечает за курсоры статичные, ну а второй — за анимированные. Зная вечную любовь Microsoft к разного рода мистификациям, можно предположить, что и за этими двумя форматами скрывается нечто совсем другое. Так и есть. Формат cur — это просто переименованный bmp определенного размера, поэтому все сказанное относительно bmp подходит и к cur. А формат ani — это анимированный riff. Для его редактирования создана куча маленьких и симпатичных программок. Пользуйтесь на здоровье. * * * Вот мы и разобрали основные форматы файлов, применяющиеся при разработке компьютерных игр. Гигантский пласт знаний все еще остается за бортом. Но мы непременно поднимем его в одном из следующих номеров "Мании", где вас ждет статья про не менее важные форматы файлов для хранения всего игрового добра — архивы. Мы опишем уже существующие форматы и методы архивирования, кодирования и сжатия, кратко пробежимся по тому, что нам предлагают сторонние разработчики, познакомимся с ресурсными библиотеками форматов res и dll и даже узнаем, как создать свой собственный формат архива, заточенный под конкретную игру. Ну а на сладкое я покажу вам свою разработку в этой области — универсальный компонент для шифрованного архивирования любых игровых ресурсов, а также программу, которая позволит работать с архивами этого формата.