Библиотеки для разработки игр в Linux
За последние несколько лет Linux проделал большой путь от "Unix-клона
для хакеров" до развитой многофункциональной операционной системы,
о которой теперь слышали почти все, кто так или иначе знаком с компьютером.
Крупные корпорации компьютерной индустрии вкладывают в Linux большие
деньги, и еще больше зарабатывают. В последнее время Linux распространился
во всех областях, и не в последнюю очередь на домашних компьютерах.
А домашний компьютер трудно представить без компьютерных игр. Долгое
время в Linux в этой области была нерадостная картина. Были либо классические
X-window игры, либо переделки c Atari, Спектрума и тому подобных.
Большинство opensource игр находились в начальной стадии разработки.
Единственной фирмой, которая делала Linux-версии своих игр, была всем
хорошо известная Id software. Ситуация
резко изменилась с появлением компании
Loki entertaiment,
которая занялась портированием под Linux самых популярных игр с платформы
Windows, заключив договора с их производителями. Хотя эти программы
по вполне понятным причинам не стали открытыми и бесплатными, тем
не менее пользователи Linux получили возможность посмотреть на последние
достижения в области компьютерных игр в своей любимой операционной
системе. С другой стороны появление игр Loki заставило многих свободных
разработчиков активно заняться своими проектами, чтобы хоть как-то
соответствовать современному уровню.
В этой статье я хотел бы рассмотреть возможности, которые может предоставить
Linux для разработчиков игр. А конкретнее рассмотреть различные библиотеки,
которые могут помочь программисту в этой области. Занимаясь этой проблемой
некоторое время, я узнал, что таких библиотек достаточно много, причем
совершенно различных - от низкоуровневых, то практически готовых игровых
движков. В этой статье я хочу рассказать про SDL, Allegro и ClanLib,
которые, на мой взгляд, наиболее универсальны и обладают большим числом
возможностей, чем другие. У меня нет большого опыта использования
этих библиотек, поэтому я даю лишь их краткий обзор, основанный на
документации, информации с сайтов разработчиков, и небольшого экспериментирования
с примерами, бывшими в "комплекте поставки" этих библиотек, и играми,
основанными на них. Я не проводил объективных тестов и сравнений,
поэтому нижеследующее лишь мое собственное мнение, так что читайте
и делайте выводы сами.
SDL
Изначально библиотека SDL была сделана фирмой Loki Entertaimant
для своих нужд, то есть для переноса игр с платформы Win32 в Linux,
и предполагалась как аналог DirectX, через который работают практически
все игры под Windows. Хотя автором и основным разработчиком библиотеки
является Sam Lantinga, ведущий программист Loki Entertaiment, SDL
является открытым проектом и доступна для разработчиков, так как очевидно,
что Loki заинтересована в широком распространении библиотеки и превращения
ее в стандартный интерфейс для разработчиков игр в Linux (и не только).
Кроме SDL Loki поддерживает еще несколько открытых проектов, таких
как интерфейс для 3D-звука OpenAL, библиотеку
для проигрывания MPEG-файлов
SMPEG,
и некоторые другие.
На самом деле сама библиотека SDL не является полноценным SDK (Software
Development Kit) для разработчиков игр. SDL - это интерфейс, предоставляющий
прямой доступ к графической системе, звуковой карте, устройствам ввода
(клавиатуре, мыши, джойстику), CD-ROM, таймеру. Библиотека включает
в себя основные низкоуровневые функции для работы с графикой, звуком,
внешними устройствами, которые необходимы разработчикам игр и мультимедийных
приложений. Благодаря тому, что в SDL реализован только необходимый
минимум функций, она довольна компактна и обладает неплохим быстродействием.
По сути SDL является ядром для других библиотек,
которые поддерживают более сложные функции в какой-то одной области
(графика, микширование звука, поддержка различных форматов файлов,
GUI и.д.) И уже вместе с ними SDL образует многофункциональный SDK
для разработчиков игр.
В Linux SDL может работать через несколько графических интерфейсов:
X11, FBdev, Svgalib
и GGI
(подробнее о графических интерфейсах в моей статье "Графические системы
Linux с точки зрения игр и мультимедиа").
Но на самом деле нормальная поддержка есть только для двух первых.
В X window библиотека поддерживает два режима. Первый - оконный, когда
вся графика отрисовывается в обычном окне. В этом случае используются
функции XShm для прямой передачи данных в видеобуфер, чтобы обеспечить
скорость, необходимую в играх. Второй режим - полноэкранный, который
работает через DGA, и обеспечивает еще большее быстродействие и полный
доступ к видеопамяти. Кроме того, SDL поддерживает DGA 2.0, расширение
DGA, появившееся в XFree 4.0.x, которое обеспечивает дополнительные
возможности для работы в полноэкранном режиме и реализует аппаратное
2D-ускорение. Кроме этого библиотека может работать через Fbdev (реализация
графического API в ядре Linux), причем есть поддержка 2D-ускорения
для видеокарт Matrox и 3Dfx, так как в общем случае функций для ускорения
в интерфейсе Fbdev к сожалению нет. Таким образом, игры, использующие
SDL могут запускаться вообще без X Window, что может несколько снизить
требования к оперативной памяти, но к сожалению Fbdev поддерживает
далеко не все видеокарты, которые работают с X11, поэтому я считаю,
что основной графической системой для SDL является X Window, поскольку
помимо вышеупомянутой причины, работа через DGA обеспечивает наибольшее
быстродействие по сравнению с другими графическими системами.
Основные функции графического API SDL - это установка графических режимов,
палитры, гамма-коррекции, работа с поверхностями и прямоугольными
плоскостями, графическим курсором. В SDL вы не найдете таких простых
и знакомых функций как PutPixel, Line, Circle и тому подобных. Разработчики
библиотеки справедливо полагали, что в современных играх никто не
будет использовать поточечный вывод на экран или подобные графические
примитивы. SDL рассчитана на быстрое копирование спрайтов в видеопамять,
перемещение их по экрану, наложение друг на друга (есть возможность
альфа-канала), скроллинг экрана и другие функции необходимые практически
во всех 2D играх, либо на простое копирование отрендеренной сцены
из рабочего буфера в видеопамять, что есть практически во всех 3D-играх.
При этом библиотека поддерживает автоматические преобразование глубины
цвета. Для ускорения этих операций используется код низкоуровневой
библиотеки Hermes, написанный с применением
MMX инструкций.
Разработчики SDL решили не изобретать велосипед и не делать свой собственный
3D API. Вместо этого они обеспечили нормальную работу с OpenGL, который
несомненно является лучшим интерфейсом для трехмерной графики для
Linux (и не только).
Из всех форматов графических файлов SDL работает только с BMP, но это
не следует считать недостатком, так как я уже говорил, функции расширяются
с помощью дополнительных библиотек. Так и в этом случае библиотека
SDL_image позволяет
загружать файлы в форматах PPM, PCX, GIF, JPEG, PNG, TGA, и TIFF.
Поддержка мультимедиа в SDL сделана с помощью уже упоминавшейся библиотеки
SMPEG, которая позволяет проигрывать видеоролики в формате MPEG 1.0,
и при этом поддерживает функции масштабирования и сглаживания изображения.
Для ускорения работы используются MMX инструкции. Кроме того SMPEG
может использовать аппаратное ускорение декодирования через SDL, которая
в свою очередь работает через расширение XVideo, имеющееся в XFree 4.0.x,
и призванное обеспечить поддержку ускорения для тех видеокарт,
где есть такая возможность. Кроме этого SMPEG позволяет играть аудиофайлы
формата MPEG 1.0 Layer I,II,III, то есть, проще говоря всеми любимые
MP3.
SDL может работать со звуком как через через стандартную систему OSS,
которая входит в ядро Linux, так и через Esound
- демон, который позволяет микшировать звук, и таким образом разделять
звуковую карту между несколькими программами. Поддержка Esound дает
возможность пользователям параллельно с играми слушать любимую музыку
в MP3. В SDL есть все основные функции работы со звуком: загрузка
файлов в формате WAV, проигрывание из буфера, преобразование формата
звуковых данных, микширование двух буферов. Если этого не достаточно,
то к вашим услугам библиотека SDL_mixer,
которая поддерживает одновременно 8 каналов 16-битного звука, и позволяет
проигрывать звуковые файлы в формате MIDI, MOD и MP3. Для проигрывания
MOD-ов используется лучшая в этой области, по мнению многих, библиотека
MikMod, которая поддерживает не только
сами MOD-ы, но и многие сходные форматы: S3M, IT, XM и еще много других.
MP3 играются через библиотеку SMPEG, о которой шла речь выше. И наконец
для поддержки MIDI использован код наверное многим известной программы
Timidity, которая проигрывает MIDI-файлы через программную реализацию
wavetable-синтезатора, используя для этого сэмплы от звуковых карт
семейства GUS, что позволяет добиться гораздо лучшего качества, чем
в FM-синтезаторах, которые используется в дешевых звуковых картах.
Тем у кого есть GUS-патчи, рекомендую попробовать Lsdldoom,
который поддерживает все эти возможности, и услышать как старые знакомые
мелодии Doom-а зазвучат совсем по-другому.
Достаточно важной частью любой библиотеки для разработки игр являются
функции для реализации GUI. Даже в 3D-action играх требуются меню
для настройки игры, а уж в реалтаймовых и пошаговых стратегиях, или
в RPG необходимость GUI очевидна. В SDL для этих целей служит библиотека
SDL_gui, которая позволяет
делать наиболее распространенные GUI-элементы: кнопки, флажки, текстовые
области, "столбики прогресса", списки, скролбары. Естественно что
для всех этих элементов можно использовать свои текстуры и спрайты,
так как стандартный "серый" GUI в играх смотрелся бы весьма странно,
особенно на фоне того, что практически все пользовательские интерфейсы
для настольных приложений позволяют использовать темы. Основной недостаток
SDL_gui сравнительно невысокое быстродействие. Но эта библиотека находится
в стадии разработки, и надеюсь в стабильной версии эта проблема будет
решена. Кроме нее еще есть GUIlib,
но она поддерживает гораздо меньше функций, чем SDL_gui, хотя и несколько
стабильнее.
Если сравнивать SDL с DirectX , то стоит упомянуть "аналог" DirectPlay
- библиотеку SDL_net,
в которой есть базовые функции, используемые в играх для осуществления
обмена данными между клиентом и сервером. Кроме этого, существует
еще много других библиотек, расширяющих функции SDL в той или иной
области. Число этих библиотек постоянно растет, и они постепенно совершенствуются,
так что в скором времени по количеству возможностей SDL наверняка
обгонит все остальные SDK для разработки игр.
Сейчас уже складывается ситуация, что если фирма разрабатывает свою
программу только для одной платформы, то заведомо проигрывает своим
конкурентам, чьи продукты работают в разных системах. Поэтому многие
программисты, прежде чем использовать SDL в своих играх под Linux,
подумают, насколько легко они смогут перенести свои "творения" в другие
операционные системы. К счастью, над эти задумывались и разработчики
SDL, поэтому уже сейчас эта библиотека может работать на платформах
Win32, BeOS, MacOS, Solaris, IRIX, FreeBSD.
Allegro
Библиотека для программирования игр Allegro имеет давнюю, по сравнению
со своими конкурентами, историю. Изначально она разрабатывалась графическая
библиотека для компилятора DJGPP (реализация gcc под DOS), но постепенно
обогащалась функциями, используемыми в играх, и появилась поддержка
звука, клавиатуры, мыши, джойстика. Таким образом Allegro стала полноценной
библиотекой для разработки игр. Но время шло, и DOS уходил в прошлое,
поэтому разработчики занялись переносом Allegro на другие платформы,
благодаря чему сейчас мы можем использовать эту библиотеку в Linux.
В отличие от SDL, Allegro основана на принципе "все в одном", поэтому
в состав библиотеки входят как низкоуровневые, так и высокоуровневые
функции. Низкоуровневые функции реализуют интерфейс для работы с графикой,
звуком и устройствами ввода (клавиатурой, мышью, джойстиком). Высокоуровневые
представляют собой простые и наиболее распространенные в играх функции,
не связанные напрямую с вводом-выводом.
В Linux Allegro может работает с видеокартой как через графические
интерфейсы X11, Svgalib, GGI, так и напрямую. В последнем случае доступны
только стандартные и X-режимы VGA-адаптера, так как драйверов для
различных SVGA-карт в Allegro нет, хотя теоретически она может работать
через VESA интерфейс. Но прямая работа с видеокартой не очень-то согласуется
с концепцией многозадачной операционной системы, поэтому лучше работать
через уже существующий графический интерфейс. Здесь все обстоит весьма
неплохо: в X11 поддерживаются XShm и DGA (хотя поддержки DGA 2.0 еще
нет), что позволяет получать нормальное быстродействие и в оконном
и в полноэкранном режиме. По утверждению авторов, поддержка Svgalib
и GGI еще полностью не реализована, но уже сейчас Allegro вполне работоспособна
с этими графическими библиотеками.
Графический API Allegro обширен и богат различными функциями. Здесь
есть обычные графические примитивы: PutPixel, Line, Circle и тому
подобные, есть много процедур для работы со спрайтами, битмапами и
прямоугольными областями экрана: копирование, перемещение, поворот,
масштабирование, преобразование глубины цвета, подсветка, наложение
с эффектом прозрачности и альфа-каналом, скроллинг экрана. Помимо
двумерных процедур, Allegro может работать с 3D-графикой, имея в своем
арсенале функции для текстурирования полигонов (простого и с перспективной
коррекцией) и освещения (плоское и Гуро). Есть процедура для построения
сплайнов Безье. Помимо графических, в Allegro реализованы математические
алгоритмы для работы с матрицами и векторами, используемые для 3D-преобразований.
Из графических форматов Allegro работает BMP, PCX, LBM и TGA и, к
сожалению, не поддерживает более современные форматы, такие как JPG
и PNG.
Из мультимедийных функций есть только поддержка видеороликов в формате
FLI/FLC, что по моему мнению, не совсем соответствует современным
требованиям.
С поддержкой аудиосистем Allegro даже немного обгоняет SDL, так как
помимо OSS и Esound поддерживает ALSA
(Advanced Linux Sound Architecture), звуковой интерфейс на уровне
ядра, который является усовершенствованием и альтернативой OSS. В
последнее время он становиться популярным, так как там лучше, чем
в OSS реализована поддержка новых звуковых карт. В Allegro есть много
функций для работы со звуковыми сэмплами, помимо стандартных - проигрывания,
остановки, микширования, преобразования формата, она позволяет накладывать
на сэмплы такие эффекты, как плавное изменение громкости, эхо, тремоло,
вибрато. Из форматов звуковых файлов библиотека поддерживает WAV,
VOC, и MIDI. Последний стоит отметить особо, так как в Allegro тоже
есть программный wavetable-синтезатор, который называется DIGMID и
который тоже использует GUS-патчи. В свое время для досовских игр
он был неплох, но, по моему мнению, он все-таки уступает по качеству
Timidity, который используется в SDL. Вы можете сами это проверить,
посмотрев пример из комплекта Allegro, либо послушав музыку в досовкой
версии Doom Legacy.
В Allegro есть неплохая реализация GUI с широким набором функций, но,
к сожалению там мало возможностей по использованию своих текстур и
спрайтов, поэтому GUI, как и многое другое в Allegro, выглядит немного
старомодно. Из других полезных вещей можно отметить поддержку
Zlib,
то есть возможность работать с данными внутри архива.
Как я говорил в начале, Allegro создавалась под DOS, а теперь к списку
платформ добавились Linux и Windows. Так что Allegro может обеспечить
переносимость написанных под нее программ.
ClanLib
ClanLib представляет собой попытку сделать универсальную библиотеку
для разработки игр, отвечающую современным требованиям, построенную
по модульному принципу, и включающую помимо низкоуровневых интерфейсов,
более сложные алгоритмы, используемые в играх.
По своей структуре ClanLib напоминает SDL, все базовые функции для
работы с графикой, звуком, клавиатурой, мышью, джойстиком, AudioCD
и сетью собраны в ядре. Сюда же входят вспомогательные алгоритмы,
вроде построения кривых и поверхностей Безье, и операций над векторами.
А драйвера для работы с графикой наоборот выделены в отдельные модули.
Помимо них есть вспомогательные библиотеки (интегрированные в отличие
от SDL в основной пакет ClanLib), которые либо реализуют дополнительные
возможности, либо служат для связи с другими специализированными библиотеками.
Список поддерживаемых в ClanLib графических интерфейсов достаточно
большой. Тут есть как "первичные" X11, Fbdev, Svgalib,
так и "надстройки" GGI и OpenPTC.
Для X11 как и в рассмотренных
выше библиотеках есть достаточно стабильная поддержка XShm и DGA (только
версии 1.0), чего не скажешь о работе с Svgalib, когда многие примеры
и игры, использующие ClanLib у меня почти всегда "вылетали" с сигналом
11. Здесь еще нужно отметить тот факт, что в отличие от SDL, которая
либо сама определяет, какой графический интерфейс использовать, либо
руководствуется установленными переменными окружения, ClanLib оставляет
этот выбор пользователю. Причем делает это оригинальным способом:
сразу после запуска любой программы, основанной на ClanLib появляется
список поддерживаемых интерфейсов и предлагается ввести с клавиатуры
название того, с каким вы хотите работать. У меня это "меню" вызвало
ностальгигечкие воспоминания о временах старых добрых игр, когда выбор
типа видеокарты из списка: CGA, EGA, VGA, Tandy,... осуществлялся
перед началом игры нажатием соответствующих цифровых клавиш. Но в
современных программах, я думаю, это будет выглядеть довольно странно.
Графическое API ClanLib ориентировано на работу со спрайтами, прямоугольными
областями, поверхностями, графическим курсором. Эти функции так реализованы
при помощи библиотеки Hermes, но работают они почему-то медленнее, чем в SDL.
Для 3D-функций
используется OpenGL. Поддерживается стандартный набор графических
форматов: BMP, PCX, PPM, TGA, PNG, кроме этого есть дополнительный
модуль для использования библиотеки ImageMagik, которая, как известно,
поддерживает довольно большое число форматов. ClanLib может играть
видеоролики в форматах FLI и MPEG.
Из звуковых интерфейсов поддерживается, к сожалению, только OSS, так
что слушать музыку одновременно с игрой не получиться. Функций для
работы с сэмплами и звуковыми потоками по сравнению с другими библиотеками
не много, но необходимый минимум есть. Сэмплы можно загружать в форматах
RAW PCM и WAV. С помощью модуля, использующего уже упоминавшуюся библиотеку
MikMod можно играть MOD-подобные треки. В ClanLib есть поддержка MIDI,
но для этого используются стандартные функции OSS, а программного
wavetable-синтезатора нет. Так что хорошее звучание музыки в этом
формате будет только у владельцев дорогих видеокарт, и то при условии,
что для этих карт в OSS есть соответствующие драйвера.
Из дополнительных возможностей в ClanLib есть модуль GUI, но мне его
не так и не удалось скомпилировать из-за весьма странной ошибки, так
что сказать о нем ничего не могу. Кроме этого в ядре библиотеки есть
реализация базовых функций для работы с сетью.
С переносимостью дела обстоят весьма неплохо, кроме Linux и некоторых
других Unix-клонов ClanLib может работать под Windows и BeOS.
Таким образом сейчас для разработки игр в Linux имеются практически
все необходимые средства, и перед программистом может встать проблема,
какую из библиотек выбрать. В большинстве случаев этот выбор будет
зависеть от типа и характеристик самой игры, которую предстоит сделать.
Но мне все таки хотелось бы высказать несколько общих соображений
об использовании этих библиотек. Несмотря на большое количество функций
и возможностей, Allegro имеет довольно таки устаревшую внутреннюю
архитектуру, и несмотря на то, что она до сих пор активно развивается,
я думаю, что это не лучший выбор для тех, кто хочет создать новый
проект, соответствующий современным требованиям. ClanLib использует
современный технологии, имеет объектно-ориентированный API, достаточно
удобна для разработчика, и имеет богатый набор функций, но вот практическая
реализация некоторых их них оставляет желать лучшего.
Поэтому сейчас, я думаю, лучший выбор - это SDL, которая сочетает в
себе универсальность, гибкость, скорость и возможность расширения.
Возможно в ней не хватает высокоуровневых алгоритмов, которые могут
облегчить жизнь разработчику игр, но этот недостаток может быть компенсирован
использование других специализированных библиотек. И я уверен, что
SDL еще долгое время будет оставаться лидером в своей области.
Впрочем, как я уже сказал, все зависит от конкретного случая. На сайтах
SDL и ClanLib есть списки игр, основанных на этих библиотеках. Вы
можете посмотреть их, протестировать их по различным параметрам, и
тогда уже делать выводы самостоятельно.
Сергей Кононенко, 14.12.2000.