вернуться к общему разделу

Низкоуровневое расширение библиотеки SDL

В современном мире SDL библиотека активно используется при написании мультимедийных программ (в основном игр) для операционной системы GNU/Linux. Но благодаря кроссплатформенности данной библиотеки, а также открытости кода эта библиотека успешно применяется в разработках под разные платформы и языки.

Изначально библиотека 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.

Место библиотеки SDL в системе взаимодействия приложения и опера­ционной системы показано на рисунке:
Место библиотеки SDL в системе взаимодействия
Рис.1.1. Место библиотеки SDL в системе взаимодействия

 У библиотеки SDL помимо того, что она кроссплатформенна, есть еще одно большое преимущество – ее функциями достаточно легко пользоваться благодаря исчерпывающей документации. Кроме руководств на официаль­ном сайте, можно найти хорошее описание всех функций в самих исходных кодах программы. И тот факт, что они распространяются свободно, позво­ляет программистам легко использовать функции библиотеки SDL в своих при­ложениях.
SDL изначально создана для 2D-графики и не имеет непосредственно функций для 3D-графики, но прекрасно дружит с OpenGL, поэтому при раз­работке игр, эти библиотеки часто используют в связке. SDL обеспечивает эффективную работу с аппаратным обеспечением, а OpenGL обладает широ­ким набором функций по обработке и построению графических объектов. В результате получается мощный инструмент программирования интерактив­ной графики. Так как обе библиотеки открыты и кроссплатформенны, при­ложения, созданные на их основе, легко переносимы на различные операци­онные системы, что расширяет аудиторию пользователей этих приложений.
Конечно, выбор библиотеки для своего проекта - личное дело каждого, но все-таки SDL является бесспорным лидером для создания игр или муль­тимедиа-программ.

В пример написание приложений при помощи библиотеки SDL могу привести игру Quake 2.

 

Скриншот из компьютерной игры Quake 2

 Рис.1.2. Скриншот из компьютерной игры Quake 2

 

Автор: Андрей Васильев (программист)

вверх

Тематика статей

Меню