Pull to refresh

Библиотека SDL — обзор

Reading time4 min
Views25K
image
В данной статье постараюсь дать краткий обзор весьма полезной open-source библиотеки SDL (Simple DirectMedia Library) для написания кроссплатформенных мультимедийных приложений. На хабре о ней почти не упоминалось, поэтому хочу восполнить этот «пробел».

Intro


SDL позиционируется как инструмент, дающий независимый от платформы низкоуровневый API для доступа к таким возможностям аппаратуры, как 2D и 3D рендеринг, воспроизведение звука и обработка устройств ввода (мышь, клавиатура, джойстик). Либа может быть полезна главным образом для тех, кто занимается разработкой cross-platform игр, однако с тем же успехом её можно использовать, например, в программах наподобие видео- и аудио-проигрывателей, эмуляторов, и т.д. Помимо вышеперечисленных возможностей, в SDL есть средства для работы с многопоточностью, файлами, таймерами и приводом CD/DVD. Это позволяет применять либу также в тех проектах, которые не связаны с графикой и/или воспроизведением звука.

SDL портирована на многие платформы. Помимо Windows, Linux и Mac OS (X), существуют также порты на Solaris, IRIX, *BSD, и т.д. Полный список есть на главной странице проекта, там же перечислены привязки ко многим языкам программирования, в т.ч. скриптовым.
Распространяется под лицензией GNU LGPL. Текущая версия 1.2.14, согласно заявлению разработчиков, выпущена для исправления ряда багов и является последней в ветке 1.2, следующая будет 1.3.

Немного об установке и API


Для всех платформ необходимые файлы доступны для скачивания на оф. сайте, а для Linux либу можно также поискать в репах (по крайней мере под Ubuntu я нашел её в пакете libsdl-dev). Исходники доступны в архивах, либо на svn.
SDL не требует установки как таковой. Подключается обычно в виде динамической библиотеки, для распространения вместе с программой достаточно прилагать единственный файл .so (.dll).

SDL написана на С. Интерфейс состоит из функций и макросов, список которых не так велик и не сложен для изучения. На вики проекта API функции и типы данных сгруппированы как по алфавиту, так и по категориям, поэтому найти что-то нужное можно практически без труда.

Небольшой пример


Ниже приведу простой пример программы, использующей SDL:

#include <SDL/SDL.h>

int main()
{
  // Инициализация подсистем SDL (видео, аудио и тайминг)
  if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0)
    return 1;
  // Флаг центрирование окна на экране
  SDL_putenv("SDL_VIDEO_CENTERED=true");
  // Инициализация видео. В данном случае оконный режим, 800x600@16 с получением контекста OpenGL и двойной буферизацией
  SDL_Surface *surface = SDL_SetVideoMode(800, 600, 16, SDL_DOUBLEBUF | SDL_OPENGL);
  if (surface == NULL)
    return 1;
  // Цикл обработки сообщений и рендеринга
  SDL_Event evt;
  bool stop = false;
  while (!stop)
  {
    // Извлекаем события из очереди
    while (SDL_PollEvent(&evt))
    {
      switch (evt.type)
      {
      case SDL_KEYDOWN:
        // Завершаемся при нажатии Esc...
        if (evt.key.keysym.sym == SDLK_ESCAPE)
          stop = true;
      case SDL_QUIT:
        // ... или при закрытии окна
        stop = true;
      default:;
      }
    }
    // Здесь может быть код отрисовки
    // ...
    // Меняем местами GL фреймбуферы
    SDL_GL_SwapBuffers();
  }
  // Завершаем работу всех подсистем SDL и освобождаем выделенную память
  SDL_Quit();
  return 0;
}

* This source code was highlighted with Source Code Highlighter.


(для меня непривычно писать комментарии на русском, но т.к. наверное не у всех хорошо с английским, на всякий случай оставлю так)

Пробегусь по коду. Прежде всего инициализируем нужные нам подсистемы. В данном случае это видео, аудио и тайминг. После этого отдельно устанавливаем видео режим функцией SDL_SetVideoMode(), которая возвращает созданный видео-контекст. Она также по совместительству также создаёт окошко, в котором будет происходить рендеринг. Флагов инициализации достаточно много, полный список есть на вики.
После предварительных настроек переходим к основному рабочему циклу программы. На каждой итерации он извлекает из очереди информацию о произошедших событиях, после чего меняет местами фреймбуферы (включена двойная буферизация). Между двумя этими действиями можно творить что-нибудь более содержательное, например отрисовывать очередной кадр анимации. Цикл выполняется до тех пор, пока не будет закрыто окно или нажата клавиша Esc. Перед завершением работы вызываем функцию SDL_Quit(), которая закрывает все подсистемы SDL.
Как видно из примера, SDL API очень простой, подготовка системы к работе занимает всего пару строчек, а цикл обработки событий похож на стандартный цикл обработки сообщений Windows-программ.

Outro


Напоследок хочу отметить несколько дополнительных моментов:
  • Для разработки на OpenGL SDL является достойной альтернативой GLUT. Можно интегрировать с различными движками (у меня получалось заставить её работать вместе с OGRE).
  • SDL не предназначена для создания каких-либо элементов интерфейса, кроме обычных окон, и не может в этом отношении конкурировать с такими проектами как Qt или wxWidgets.
  • Проект имеет достаточно удобную документацию на нескольких языках, в т.ч. в оффлайн версии. Помимо вики существует подробное описание возможностей библиотеки и много уроков, составленных сообществом.
  • Библиотека заслужила немалую популярность среди игроделов (в основном под Linux), и используется в таких проектах как Nexuiz и Civilization: Call To Power. Сам я узнал о либе, копаясь в файлах Nexuiz и наткнувшись на ещё непонятную для меня на тот момент аббревиатуру SDL :).
  • Доступен список API, которые использует сама библиотека на разных платформах для вывода графики и звука.
  • Наконец, основным разработчиком библиотеки является Sam Lantinga, инженер по программному обеспечению из небезызвестной Blizzard Entertainment :)

Вот и всё. Обзор получился весьма поверхностым, хотя надеюсь, он будет полезен тем, в чью сферу интересов входит разработка мультимедийных приложений, и кто ещё не слышал про эту библиотеку.
Tags:
Hubs:
Total votes 20: ↑20 and ↓0+20
Comments11

Articles