Все о Linux. LinuxRSP.Ru


Cвежие новости Linux и BSD, анонсы статей и книг прямо в почтовый ящик!
Подписаться письмом


 Сегодняшние новости:

25 лет исполнилось ядру Linux

Релиз KDevelop 5.0

Oracle открывает код JDK9 для ARM

Выпущен Timewarrior 1.0.0

Релиз Android 7.0

Percona Memory Engine для MongoDB на базе WiredTiger

PowerShell открыт и доступен для Linux

Форк TrueCrypt: VeraCrypt 1.18

Релиз Snapcraft 2.14

Релиз Go 1.7

Стабильный выпуск рабочего стола Lumina

Вышла первая версия аналога OpenCV - DCV 0.1

Выпуск минималистичной программы для мониторинга jsonmon 3

В MIT разработали новый язык программирования

Первый релиз Qt5Gtk2

Godot 2.1 - новая версия открытого игрового движка

Свободная цифровая станция звукозаписи: Ardour 5.0

Обновление SkypeWeb Plugin for Pidgin

Вышла версия 3.0 Android File Transfer для Linux (и для OS X)

Программный аналог MIDI-контроллера для создания музыки: Launchpadd v1.3

Mozilla спонсирует поддержку Python 3.5 в PyPy

Ef 0.08 - программа для моделирования динамики заряженных частиц

Обновление текстового редактора TEA до версии 42.0.0

Релиз OpenOrienteering Mapper 0.6.4

Вышли Guix и GuixSD 0.11

Релиз Opera 39

Выпуск LibreOffice 5.2

В OpenSSH обнаружены и устранены некоторые уязвимости

Эмулятор FCEUX 2.2.3

Компания Билайн переходит на российскую СУБД с открытым исходным кодом Tarantool

Google

 Новые статьи :

Утилиты для восстановления потерянных данных в Linux

Лучшие файловые менеджеры для Android

20 лучших бесплатных книг о Linux

Как сгенерировать открытый/закрытый SSH-ключ в Linux

Grive - клиент Google Drive для Linux с открытым исходным кодом

Протокол IPv6: варианты подключения

Сервер из образа: DHCP + TFTP + Initrd + OpenVZ

Обзор веб-панелей управления хостингом

Приёмы работы с Vim

Nginx как Reverse Proxy для сайта, использующего SSL

Разработка модулей ядра Linux

Мониторинг нагрузки http-сервера Apache 2

Перевод комментариев к файлу конфигурации Squid

Решение проблем при использовании "1c предприятие" 8.2 в Linux

Advanced Bash-Scripting Guide Искусство программирования на языке сценариев командной оболочки







Rambler's Top100





 
 

Библиотеки для разработки игр в 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.


      

Связь | О проекте LinuxRSP | Реклама | О Linux
© 1999-2017 LinuxRSP