Что такое SDL?
Simple DirectMedia Layer (SDL) — это кроссплатформенная мультимедийная библиотека, реализующая единый программный интерфейс к графической подсистеме, звуковым устройствам и средствам ввода для широкого спектра платформ. Официально поддерживает такие операционные системы как: Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, и QNX. Приложения написанные с использованием SDL могут также работать и в следующих операционных системах: AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS, и OS/2.
Использовать sdl вы можете соследующими языками программирования: Ada, C#, D, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, С++, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby, Smalltalk и Tcl.
SDL распространяется по лицензии GNU LGPL второй версии. Эта лицензия позволяет вам свободно использовать SDL в комерческих программах.
Это официальное объяснение, теперь более понятное :). SDL — это библиотека которую вы можете использовать для создания 2d игр (и даже 3d).
Особенности
Независимость библиотеки от операционой системы и языка программирования
Внятная, понятная документация
Простая в использовании библиотека
Отрисовка графики через свой рендер, через OpenGL (что позволяет делать трехмерную игру) а при некотором старании и чтении документации с официального сайта возможность отрисовывать графику через DirectX.
Дополнительные библиотеки позволяющие расширить функциональность основной, такие как:
sdl image — позволяющая использовать разные графические форматы к примеру *.jpg или *.png.
sdl mixer — позволяет использовать разные звуковые форматы.
sdl net — повзоляет использовать сетевые возможности.
sdl rtf — позволит работать с тектовым форматом *.rtf. Например, можно будет записать в word’е справку и потом ее выводить в игре.
sdl ttf — позволяет использовать в игре любые ttf шрифты.
плюс разнообразные gui и оболочки для кода которые ожно найти на просторах интернета.
Библиотека SDL — обзор
В данной статье постараюсь дать краткий обзор весьма полезной 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:
int main()
// Инициализация подсистем SDL (видео, аудио и тайминг)
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0)
return 1;
// Флаг центрирование окна на экране
SDL_putenv( «SDL_VIDEO_CENTERED=true» );
// Инициализация видео. В данном случае оконный режим, 800×600@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 🙂
Жизненный цикл разработки защищенных приложений (Майкрософт)
Жизненный цикл разработки безопасности (SDL) — это процесс обеспечения безопасности, ориентированный на разработку программного обеспечения. Как инициатива корпорации Майкрософт и обязательная политика с 2004 года, SDL сыграла важную роль во внедрении безопасности и конфиденциальности в программное обеспечение и культуру корпорации Майкрософт.
Благодаря сочетанию целостного и практического подхода SDL стремится уменьшить количество и серьезность уязвимостей в программном обеспечении. SDL предоставляет безопасность и конфиденциальность на всех этапах процесса разработки.
Microsoft SDL основан на трех основных понятиях:
- Education
- Непрерывное улучшение процесса
- Подотчетности
5. Знакомство с библиотекой SDL
Изучите документацию мультимедийной библиотеки SDL. Разработайте на основе данной библиотеки приложение для отображения на экране изображений формата BMP.
Указания
Simple DirectMedia Layer (SDL) — это свободная кроссплатформенная мультимедийная библиотека, реализующая единый программный интерфейс к графической подсистеме, звуковым устройствам и средствам ввода.
Подробную документацию по библиотеке можно найти по адресу: http://wiki.libsdl.org/FrontPage. Весь основной функционал SDL2 для отрисовки видео описан по адресу: http://wiki.libsdl.org/MigrationGuide.
Для разработки приложений на основе SDL необходимо скачать и установить следующие файлы:
- исходные коды библиотеки:
- скомпилированные DLL-файлы библиотеки:
1. Скачайте и распакуйте исходные коды библиотеки SDL в некоторую папку $SDL.
2. Откройте среду разработки Visual Studio и создайте пустой проект C++. Откройте свойства созданного проекта. Аналогично пункту 2 задания 3, на закладке VC++ Directories добавьте распакованные папки $SDL/include и $SDL/lib/x86 в списки Include Directories и Library Directories соответственно. На закладке Linker/Input в список Additional Dependencies добавьте библиотеку SDL2.lib.

3. Создайте новый файл с расширением .cpp со следующим содержимым:
#include #undef main int main(int argc, char *argv[])
Поскольку библиотека SDL по умолчанию переопределяет функцию main(), для корректной работы требуется отменить данное поведение с помощью инструкции #undef. Соберите проект; при возникновении ошибок компоновщика проверьте правильность выполнения предыдущих шагов.
4. Скачайте собранный DLL-файл библиотеки SDL и распакуйте его в папку с собранной в пункте 3 программой. Для возможности отладки скопируйте его также и в папку с исходными кодами вашей программы. Откройте командную строку и запустите приложение. При возникновении ошибок проверьте правильность размещения файлов библиотек.
5. Инициализируйте библиотеку и создайте главное окно приложения:
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); SDL_Window *screen = SDL_CreateWindow("My SDL Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 512, 512, SDL_WINDOW_OPENGL);
6. Создайте рендерер:
SDL_Renderer *renderer = SDL_CreateRenderer(screen, -1, 0);
Для работы с рендерером используются следующие функции:
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer);
7. Для загрузки и отображения текстуры используйте функции:
SDL_Surface *surface = SDL_LoadBMP(filename); SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
