LINUX.ORG.RU

SDL 2.0.7

 , ,


1

3

Simple DirectMedia Layer (SDL) — это свободная кроссплатформенная мультимедийная библиотека, реализующая единый программный интерфейс к графической подсистеме, звуковым устройствам и средствам ввода для широкого спектра платформ. Она активно используется при написании кроссплатформенных мультимедийных программ (в основном игр).

Основные изменения по сравнению с 2.0.6:

  • Добавлены новые функции для преобразования звуковых потоков: SDL_NewAudioStream, SDL_AudioStreamPut, SDL_AudioStreamGet, SDL_AudioStreamAvailable, SDL_AudioStreamFlush, SDL_AudioStreamClear и SDL_FreeAudioStream.
  • Добавлены функции для запроса и установки функций выделения памяти: SDL_GetMemoryFunctions, SDL_SetMemoryFunctions и SDL_GetNumAllocations.
  • Добавлены функции блокировки для многопоточного доступа к API управления джойстиков и игровых контроллеров: SDL_LockJoysticks, SDL_UnlockJoysticks.
  • Функции SDL_SetEventFilter, SDL_GetEventFilter, SDL_AddEventWatch и SDL_DelEventWatch теперь потокобезопасны.
  • Улучшен код ресемплинга аудио.
  • Исправлена поддержка D-Bus.

>>> Подробности

★★★★★

Проверено: jollheef ()
Последнее исправление: sudopacman (всего исправлений: 4)

Клёво. Используют ли эту библиотеку для десктопного gui-софта? И легче ли это в сравнении got/qt/tk...?

Есть примеры десктопного софта(не игр) на ней?

ult
()
Ответ на: комментарий от ult

это инструменты, предназначенные для разных целей

sdfg
()

удивительно, но в большинстве случаев требуется SDL версии 1.2 , а 2.0 не катит! почему так я до сих пор не понимаю... может Вы знаете?

SakuraKun ★★★★★
()
Ответ на: комментарий от SakuraKun

Вообще SDL1 и SDL2 между собой несовместимы, так что старый софт, который не портировали, будет требовать SDL 1.2

Gary ★★★★★
()
Ответ на: комментарий от SakuraKun

There is no compatibility layer built in to SDL2. If an API changed for 2.0, we've changed or removed the old functions where it makes sense. If you point your 1.2 program at the 2.0 headers, it will probably fail to compile.

http://wiki.libsdl.org/MigrationGuide

fluorite ★★★★★
()
Ответ на: комментарий от ult

Есть примеры десктопного софта(не игр) на ней?

sfxr, milkytracker

Но вообще для написания гуя SDL не годится, условно всё что он умеет, это блиттить картинку на экран, играть звук и считывать с устройств ввода. Это довольно низкоуровневая библиотека.

Gary ★★★★★
()
Ответ на: комментарий от SakuraKun

API разный от слова совсем. Под SDL подразумевают или 1.2, или 2.0. Но чтобы не было путаницы, если проект использует 2.0, то так и пишется — SDL2.

a1batross ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Да. Инклуды лежат в SDL2, в либы называются libSDL2.

a1batross ★★★★★
() автор топика
Ответ на: комментарий от Gary

Поэтому и поинтересовался, вдруг не так

Deleted
()

Великая вещь! Великая! Она помогает стандартизировать разработку игр под Linux. И поэтому, тот кто не использует ее - великий м***к!

anonymous
()
Ответ на: комментарий от ult

Примеры десктопного софта на базе SDL

Используют ли эту библиотеку для десктопного gui-софта?

Да.

Есть примеры десктопного софта(не игр) на ней?

MilkyTracker – кросс-платформенная программа для создания и редактирования трекерной музыки.

http://milkytracker.titandemo.org
MilkyTracker 1.0.0

atsym ★★★★★
()
Ответ на: комментарий от mittorn

Самое забавное, что в 1.2 вполне умела. Там вообще SDL_SetVideoMode. :)

a1batross ★★★★★
() автор топика
Ответ на: комментарий от ult

Это не заслуга sdl. Sdl там только окно открывает

mittorn ★★★★★
()
Ответ на: комментарий от Gary

Gary> Но вообще для написания гуя SDL не годится, условно всё что он умеет, это блиттить картинку на экран, играть звук и считывать с устройств ввода

А что «высокоуровневого» вам нужно-то??? Понятно, что окон там не будет, но это решаемо. Откровенно, венда как раз и лажает в том, что слишком много делает в бэкграунде, что коверкает всю логику в приложении.

matumba ★★★★★
()
Ответ на: комментарий от matumba

Ну вот в Qt и GTK+ есть хотя бы готовые виджеты и обработка событий от них, я уже молчу про всё остальное

Окна, кстати, в SDL2 есть

Gary ★★★★★
()

Я пишу на SDL во время секса. Настолько плох мой секс.

anonymous
()

SDL is written in C

бальзам на душу. немедленно пробую. спасибо автору новости за то, что я теперь знаю за SDL

pihter ★★★★★
()

эта. а есть книги/учебники на Великом и могучем? (на языке вероятного противника я читать умею, но на родном, все же лучше :)

pihter ★★★★★
()

Использую эту библиотеку. Отличная штука.

EXL ★★★★★
()
Ответ на: комментарий от Gary

чтобы не блиттитть на экран 1080p ккртинку 320x240.
Даже если сделать изменение разрешенмя через fbo, это будет медленнее работать т.к в итоге будет блиттиться и прогоняться через пиксельный шейдер весь экран каждый кадр.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Во-первых, в SDL2 на платформах, где есть доступ к аппаратному ускорению, поверхности уже на самом деле пара полигонов, просто при масштабированном выводе соответствующим образом преобразуются координаты, никаких прогонов через шейдер не происходит.

Во-вторых, что ты будешь делать, есть на целевом устройстве нет разрешения 320x240?

Gary ★★★★★
()
Ответ на: комментарий от Gary

очевидно - использовать те разрешения которые есть.
Любая отрисовка через opengl - прогон через фрагментный шейдер за исключением некоторых редких случаев когда оборудование использует ffp.
А изменение разрешения нужно для относительно старых платформ, где не всегда можно себе позволить лишний раз прогнать через fbo картинку (и то если этот fbo вообще есть. А если нет что? glReadPixels??? enjoy your 10fps)

mittorn ★★★★★
()
Ответ на: комментарий от Gary

Но вообще для написания гуя SDL не годится, условно всё что он умеет, это блиттить картинку на экран, играть звук и считывать с устройств ввода.

Не совсем. Там еще есть https://wiki.libsdl.org/SDL_StartTextInput и какие-то SDL_TEXTINPUT, SDL_TEXTEDITING эвенты, которые при этом срабатывают, т.е. есть какая-то поддержка языков ввода: https://wiki.libsdl.org/Tutorials/TextInput

Ну а в остальном эта штука по своей сути очень напоминает какой-то XCB или Xlib по части обработки событий мыши/клавиатуры, отрисовки всякой ерунды.

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 2)
Ответ на: комментарий от SakuraKun

SDL2 - это новая библиотека разработанная при активной поддержке Valve. С SDL1 несовместима, но это к лучшему.

Quasar ★★★★★
()
Ответ на: комментарий от pihter

Есть неплохая документация и вполне удобно организованный исходный код. Куда лучше учебников или туториалов.

Хотя если интересно, почти каждая опенсорсная игра его использует: можно поглядеть в сорцы игры.

a1batross ★★★★★
() автор топика
Ответ на: комментарий от mittorn

очевидно - использовать те разрешения которые есть.

Ну и как ты будешь скейлить тогда? У тебя же картинка под другое разрешение

Любая отрисовка через opengl - прогон через фрагментный шейдер за исключением некоторых редких случаев когда оборудование использует ffp.

Погоди, я-то думал тебе представился какой-то дополнительный масштабирующий шейдер, сейчас ты вообще говоришь что через OpenGL рисовать нельзя потому видеокарта производит растеризацию? На каких это платформах фрагментный шейдер из двух строк ведёт за собой гроб крест 10 фпс?

Gary ★★★★★
()
Ответ на: комментарий от anonymous

нет, не умеет. Оно изменит разрешение экрана и выставит окну флаг полного экрана. на windows и linux это приводит к тому что изображение окажется за границами отображаемой области. это работает корректно в единственном случае - разрешение экрана рабочего стола равно или меньше чем то которое хочешь установить.

mittorn ★★★★★
()
Ответ на: комментарий от Gary

10fps там где fbo нет т.к glReadPixels достаточно медленный.
Однако когда fbo есть - не очень всё хорошо. На системах с низкими частотами памяти и большими дисплеями можно получить просадку fps в 2 раза на достаточно простой графике.Проблема будет заметна на мобильных платформах и на старых пк 2004-2005 года. И если игру работавшую хорошо тогда перенести на современный SDL - обидно будет терять такую возможность. Понятно, что эта проблема незаметна если используются какие-то сложные шейдеры - оно там всё равно нормально работать не будет.
У меня даже на Intel HD Graphics 2500 дополнительный рендер через fbo отнимает треть fps. Но это на быстрой памяти. А что будет на всяких виндопланшетах, в которые помимо медленного атома запросто поставят 1080 дисплей?

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Да? А зачем тогда 2 отдельных флага SDL_WINDOW_FULLSCREEN и SDL_WINDOW_FULLSCREEN_DESKTOP? Только что проверил - все корректно работает. Вот просто изменить разрешение десктопа, чтобы на нем не было SDL окна - нельзя и это сделано намеренно, т.к. пользователей бесит когда они видят как искажается их десктоп, да еще и если вылетит при этом не изменив обратно. Просто разрешение десктопа пользователь сам меняет в настройках системы, эдакая защита от дурака.

lieff
()
Ответ на: комментарий от lieff

само окно нормально выглядит. Только оно размером не с экран в итоге, а с рабочий стол. И если ты рисуешь там что-то через opengl, то вьювпорт будет попадать не туда, куда надо. Если используется какой-либо композитинг без отключения редиректа (ну захочу я например экранную клавиатуру поверх нарисовать) - будет оверхед от текстуры всего этого огромного окна.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Нет, это тут не причем. Даже создав не полноэкранное окно размер фреймбуффера может отличаться от размера окна. Именно для этого есть SDL_GetWindowSize и SDL_GL_GetDrawableSize (glfwGetWindowSize/glfwGetFramebufferSize для glfw etc, это есть везде). При этом при SDL_WINDOW_FULLSCREEN вы правы, изменения разрешения не произойдет и соотношение размеров окно/буфер изменится, но оно и могло не совпадать. При SDL_WINDOW_FULLSCREEN_DESKTOP же изменение разрешения произойдет, точно так же как в SDL 1.2, а соотношение будет таким же.

lieff
()
Ответ на: комментарий от mittorn

Причем здесь вообще FBO/glReadPixels? Какой ещё дополнительный рендер через FBO? Или я что-то не понимаю, или ты, давай разбираться.

На нефиксированном пайплайне для того чтоб отрисовать простую картинку достаточно одного вершинного и одного фрагментного шейдера. Мастшабирование происходит во фрагментом шейдере. Откуда «дополнительный прогон»?

Gary ★★★★★
()
Ответ на: комментарий от lieff

SDL_WINDOW_FULLSCREEN_DESKTOP не позволяет задать разрешение отличное от текущего разрешения экрана. внимательнее читай доки. В итоге у нас просто не остаётся способа изменить разрешение средствами SDL - размер opengl буффера будет неправильным.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Прошу прощения, перепутал SDL_WINDOW_FULLSCREEN и SDL_WINDOW_FULLSCREEN_DESKTOP местами. При SDL_WINDOW_FULLSCREEN происходит изменение видеорежима.

lieff
()
Ответ на: комментарий от Gary

fbo это единственный способ изменить разрешение средствами SDL и opengl - т.е не прибегая к обращениям к иксам/winapi напрямую. Вместо того чтобы изменять разрешение открывается полноэкранное окно и делается рендер в текстуру с последующим растягиванием её на весь экран. Source и GoldSource при переходе на SDL2 стали менять разрешение через fbo т.к нормальная смена разрешения там не работает.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Вместо того чтобы изменять разрешение открывается полноэкранное окно и делается рендер в текстуру с последующим растягиванием её на весь экран.

ЗАЧЕМ?

Gary ★★★★★
()
Ответ на: комментарий от lieff

Я уже описал как оно происходит. Он изменяет реальное разрешение экрана оставляя окно растянутым до виртуального. В результате получается неправильный размер окна. Придётся или городить хаки с glViewPort и преобразованием координат мыши даже не зная как их сдвинуть корректно или не использовать такую смену разрешения.

mittorn ★★★★★
()
Ответ на: комментарий от mittorn

Нет, SDL2 прекрасно меняет видеорежимы, вот это в коде:

int
SDL_SetWindowDisplayMode(SDL_Window * window, const SDL_DisplayMode * mode)
{
    CHECK_WINDOW_MAGIC(window, -1);

    if (mode) {
        window->fullscreen_mode = *mode;
    } else {
        SDL_zero(window->fullscreen_mode);
    }

    if (FULLSCREEN_VISIBLE(window) && (window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP) {
        SDL_DisplayMode fullscreen_mode;
        if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {
            SDL_SetDisplayModeForDisplay(SDL_GetDisplayForWindow(window), &fullscreen_mode);
        }
    }
    return 0;
}

SDL_SetDisplayModeForDisplay не публична специально, причины выше.

lieff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.