SDL 3.4 засилва оперативната съвместимост между 3D GPU API и 2D рендерирането.

  • SDL 3.4 засилва оперативната съвместимост между 3D GPU API и 2D рендерирането, с нови рендери, GPU състояния и поддръжка за YUV и HDR.
  • Тази версия добавя вградена поддръжка на PNG, нови опции за мащабиране и маршрутизиране на текстури, анимирани курсори и разширени събития за въвеждане и прозорци.
  • Включва специфични подобрения за Windows, macOS, Linux, Emscripten, iOS и visionOS, както и разширена поддръжка за контролери, HID и атомен KMSDRM.
  • SDL 3.4 е утвърдена като зряла версия на SDL3, с по-голяма стабилност, по-добра производителност и по-дълбока интеграция със Steam, Vulkan и уеб платформи.

3.4 SLD

Ако работите в разработването на видеоигри или междуплатформени мултимедийни приложения, вероятно сте чували за SDL. пристигането de SDL 3.4Библиотеката прави значителен напредък по отношение на графичните възможности, поддръжката на платформи и инструментите за подобряване на потребителското изживяване, както на настолни компютри, така и на уеб устройства и мобилни устройства. Това не е малка актуализация: тя обхваща всичко - от 2D рендеринг енджин и 3D GPU API до обработка на звук, драйвери, въвеждане с писалка, съвременни Linux системи и други.

Въпреки че SDL 3 продължава да се развива, клонът 3.4 се представя като много солидна версия Проектиран да помогне на нови и текущи проекти да се възползват от подобрения в производителността, нови API и по-добра интеграция със среди като Emscripten, Wayland, Vision Pro или дори PlayStation 2 в много специфични контексти. Нека разгледаме по-отблизо какво е новото в SDL 3.4, защо е от значение за следващия ви проект и какви технически подробности трябва да имате предвид, ако искате да извлечете максимума от него.

Най-важните общи нови функции на SDL 3.4

Основната работа на SDL 3.4 се фокусира върху Подобряване на оперативната съвместимост между 3D и 2DТова е ключово за игровите енджини и приложения, които съчетават 2D интерфейси с 3D съдържание. Досега комбинирането на двата слоя можеше да изисква повече работа от разработчика; тази версия въвежда нови помощни програми и свойства, които улесняват този процес.

В допълнение към графиката, актуализацията включва вградена поддръжка за PNG изображенияИма забележителни подобрения в системата за въвеждане (мишка, стилус, жестове, екранна клавиатура) и множество специфични промени за Windows, macOS, Linux, Emscripten, iOS, visionOS и други по-рядко срещани платформи. Интеграцията с екосистемата на Steam и нейната среда за изпълнение също е усъвършенствана, което е от решаващо значение за Linux игрите и междуплатформената разработка, насочена към разпространение в Steam.

SDL 3
Свързана статия:
SDL 3: Новата ера за разработка на Linux и междуплатформени игри

Взаимодействие между 3D GPU API и 2D рендериране

Една от силните страни на SDL 3.4 е тласъкът към интеграция между 3D и 2DБиблиотеката въвежда нови функции за създаване на 2D рендери, базирани на GPU, и за обмен на информация между текстури на GPU и пикселни формати, обработвани от SDL.

  • Това добавя SDL_CreateGPURenderer() да се създаде 2D рендерър, който използва основния GPU API.
  • Con SDL_GetGPURendererDevice() Можете да извлечете устройството за графичен процесор, свързано с този рендерер.
  • Те се присъединяват SDL_CreateGPURenderState(), SDL_SetGPURenderStateFragmentUniforms(), SDL_SetGPURenderState() и SDL_DestroyGPURenderState() за работа с фрагментни шейдъри в рамките на 2D GPU рендериране.
  • Сега са приети YUV текстури и HDR цветови пространства в 2D рендера, базиран на GPU, което е особено интересно за висококачествено видео и съдържание.

Той също така включва функции като SDL_GetGPUDeviceProperties()Това връща свойствата на графичния процесор (GPU), включително име на устройството, име и версия на драйвера, както и друга информация, свързана с решения за съвместимост или диагностика. Освен това, `SDL_GetPixelFormatFromGPUTextureFormat()` и `SDL_GetGPUTextureFormatFromPixelFormat()` улесняват преобразуването между формати на текстури на GPU и SDL пикселни формати.

Успоредно с това, имотът е включен SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER За да се създаде 2D текстура от съществуваща GPU текстура, и SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER за да се получи GPU текстурата, свързана с 2D текстура, когато се използва 2D GPU рендерер. Този подход значително намалява триенето при смесване на съдържание, генерирано в GPU API, с класическия SDL 2D конвейер.

Подобрения в 2D рендирането и обработката на текстури

SDL 3.4 надхвърля обикновената оперативна съвместимост и добавя специфични функции за фина настройка на качеството и контрола на 2D рендиранетоНапример, въведена е SDL_RenderTexture9GridTiled(), която позволява рендиране с 9 решетки с текстури в режим „плочки“, вместо разтягането им, избягвайки деформации в интерфейсните елементи или рамки.

За да се управлява мащабирането на текстурите, се добавят следните елементи SDL_GetDefaultTextureScaleMode() и SDL_SetDefaultTextureScaleMode(), който позволява задаване на режим на мащабиране по подразбиране за нови текстури. С това са свързани SDL_GetRenderTextureAddressMode() и SDL_SetRenderTextureAddressMode(), заедно с константата SDL_TEXTURE_ADDRESS_WRAP, която предоставя поддръжка за обвиване на текстури когато рендерърът посочи, че поддържа обвиване (SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN).

Много интересна нова функция за игри с ретро естетика е SDL_SCALEMODE_PIXELART, алгоритъм за мащабиране, предназначен за пикселно изкуство, който избягва класическото размазване на други режими на филтриране, запазвайки дефинираните ръбове дори при значително увеличаване на изображението.

Съществува и възможност за работа с текстурни палитриSDL_SetTexturePalette() и SDL_GetTexturePalette() ви позволяват да присвоявате и заявявате палитри в текстури, което е полезно, ако пресъздавате стари графични стилове или искате да оптимизирате определени потоци от памет и трафик.

По отношение на повърхностите, SDL 3.4 включва SDL_RotateSurface() За да се създадат завъртени копия на повърхност, се добавя SDL_FLIP_HORIZONTAL_AND_VERTICAL, за да се обърнат повърхностите едновременно по двете оси. Освен това, свойството SDL_PROP_SURFACE_ROTATION_NUMBER (по-късно заменено с SDL_PROP_SURFACE_ROTATION_FLOAT в промените на финалната версия) се използва за задаване на ъгъла, необходим за правилно показване на изображенията от камерата.

Поддръжка на оригинален PNG и зареждане на повърхността

Едно от най-желаните подобрения по отношение на практичността е, че SDL 3.4 включва вградена поддръжка за PNG...без да се разчита на външни библиотеки в много случаи. Това опростява много от малки проекти и прототипи.

  • SDL_LoadPNG() и SDL_LoadPNG_IO() позволяват зареждането на PNG изображения директно като повърхности.
  • SDL_SavePNG() и SDL_SavePNG_IO() се използват за запазване на повърхности във PNG формат.
  • Con SDL_ЗарежданеНаПовърхност() SDL_LoadSurface_IO() автоматично разпознава дали файлът е BMP или PNG и го зарежда върху повърхност, без да се налага да се притеснявате за формата.

Тази интегрирана подкрепа се изразява в по-малко зависимости и външни конфигурацииТова е особено полезно при компилиране за множество платформи или използване на SDL в среди като Emscripten, където намаляването на броя на помощните библиотеки променя както размера на двоичния файл, така и сложността му.

Вход: мишка, стилус, жестове и екранна клавиатура

SDL 3.4 значително подобрява всичко, свързано с разширени входни устройстваВ домейна на мишката е въведена SDL_SetRelativeMouseTransform(), която позволява прилагане на персонализирана трансформация към относителния вход на мишката, полезна за техники за мащабиране, инверсия на оси или специални съпоставяния.

Що се отнася до моливите и стилусите, изглежда SDL_GetPenDeviceType()което ви позволява да различите дали писалката действа директно върху екрана или върху отделен тъчпад, много полезна подробност за адаптиране на потребителското изживяване според типа на устройството.

На устройства с виртуална клавиатура, SDL добавя събития като SDL_EVENT_SCREEN_KEYBOARD_SHOWN и SDL_EVENT_SCREEN_KEYBOARD_HIDDEN, които докладват кога екранната клавиатура е показана или скрита. Това ви дава свобода на действие да настройвате интерфейса, да местите елементи или да предотвратявате покриването на текстови полета.

Системата за жестове също се разширява със събития SDL_EVENT_PINCH_BEGIN, SDL_EVENT_PINCH_UPDATE и SDL_EVENT_PINCH_ENDкоито разпознават жестове с щипване за мащабиране и подобни действия. Освен това, в средата на Wayland е коригирана поддръжката за повече от пет бутона на мишката и в X11 е въведено прецизно скролиране, подобрявайки плавността на финото скролиране.

Накрая, SDL 3.4 включва SDL_GetEventDescription(), функция за получаване на английско описание на събитие, предназначена за регистриране и отстраняване на грешки, нещо много полезно, когато проследявате редки входни поведения на множество платформи.

Аудио: по-гъвкави работни процеси и липса на повторна обработка на системата

Аудио подсистемата също получава своя дял от подобрения, със силен фокус върху Ефективна обработка и контрол на тръбопроводаКато начало, SDL_EVENT_AUDIO_DEVICE_ADDED вече се изпраща и по време на инициализацията за всяко открито аудио устройство, което улеснява откриването и изброяването на устройства, без да се налага да се чакат динамични събития.

Две нови функции, SDL_PutAudioStreamDataNoCopy() и SDL_PutAudioStreamPlanarData(), дават повече опции при работа с аудио потоци: първият избягва ненужни копия в определени случаи, а вторият позволява въвеждането на данни в планарен формат, вместо преплетени, идеално за напреднали потоци или интеграция с библиотеки за обработка на аудио на високо ниво.

В допълнение, подсказката SDL_HINT_AUDIO_DEVICE_RAW_STREAM заема централно място: тази подсказка показва, че операционната система Не трябва да прилагате допълнителна обработка към аудиото. (като например шумопотискане). Това е ключово, ако вашето приложение или игра вече обработва данните и не искате операционната система да се намесва и да изкривява резултата. Въведена е и SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN, която позволява на определени потоци да оцелеят след жизнения цикъл на аудио подсистемата, нещо полезно при по-сложни архитектури.

HID контролери и устройства

SDL 3.4 значително подобрява поддръжката на контролери и HID устройства, разширявайки гамата от хардуер, който работи веднага след инсталирането му, без външна конфигурация. По-специално, той добавя Подобрена поддръжка за 8BitDo контролериFlyDigi и Hand Held Legend SINput, което улеснява по-последователната работа на много геймпадове на трети страни.

Също така е инкорпориран Стойка за контролер Nintendo Switch 2 с кабел Когато SDL се компилира с libusb, това е интересно за потребители, които предпочитат директна връзка пред безжичен режим. На ниво HID API, SDL_hid_get_properties() изглежда свързва SDL свойствата с HID устройства, а свойството SDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER позволява извличане на дескриптора на libusb, свързан с SDL_hid_device, когато то е било отворено с libusb.

Тези подобрения са в допълнение към факта, че SDL 3.4 включва поддръжка за новия Steam контролер в рамките на своята начална екосистема и това се вписва много добре в ролята му в Steam runtime и фокуса върху игрите на Linux и други платформи.

Събития, система и общи помощни програми

Освен графичните и входните аспекти, SDL 3.4 въвежда серия от промени в системата за събития и общите помощни програми, за които си струва да знаете. Например. SDL_EVENT_WINDOW_EXPOSED Вече попълва полето data1 с true, когато се изпраща по време на преоразмеряване на прозорец на живо, предоставяйки допълнителен контекст.

Това добавя SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGEDТова събитие се задейства, когато използваемите граници на работния плот се променят (например при преместване на ленти със задачи или панели). То включва също SDL_EVENT_SCREEN_KEYBOARD_SHOWN/SDL_EVENT_SCREEN_KEYBOARD_HIDDEN и споменатите по-рано събития за щипване, като по този начин осигурява по-цялостна екосистема от събития за динамични сценарии на потребителския интерфейс.

От страна на печалбата, SDL_HINT_MAIN_CALLBACK_RATE вече може да се зададе като стойност с плаваща запетая, което дава по-голяма точност; SDL_AddAtomicU32() Добавя поддръжка за атомарни събирания на 32-битови неподписани цели числа; и SDL_GetSystemPageSize() връща размера на системната страница, полезен за задачи с памет на ниско ниво.

Включени също SDL_ALIGNED()Този макрос показва, че определени данни трябва да имат специфично подравняване, което е много важно за оптимизации на производителността и използването на SIMD инструкции. Междувременно, SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER ви позволява да дефинирате персонализирана функция за освобождаване на паметта, използвана от SDL_IOFromMem() и SDL_IOFromConstMem(), което ви дава по-голям контрол при интегрирането на SDL със собствени разпределители.

Друго интересно подобрение е поддръжката за подробен лог изход Когато променливата на средата DEBUG_INVOCATION е зададена на "1", предназначена е за дълбоко дебъгване на инициализацията и поведението на библиотеката в сложни контексти.

Специфични подобрения в Windows

В Windows, SDL 3.4 включва значителни промени, засягащи аудиото, видеото и системата за въвеждане. Една от интересните точки е функцията за подсказки. SDL_HINT_RENDER_DIRECT3D11_WARPТова ви позволява да активирате WARP (софтуерния растеризатор на D3D11). Това е полезно на машини без съвместим графичен процесор или във виртуализирани среди, където няма директно ускорение, но все пак искате да използвате API.

Драйверът WASAPI се възползва от SDL_HINT_AUDIO_DEVICE_STREAM_ROLE За да се коригира категорията на аудио потока, важна интеграция за системно-съвместимо поведение (напр. аудио от игра, комуникации и др.). Също така се разчита на SDL_HINT_AUDIO_DEVICE_RAW_STREAM, за да се посочи дали драйверът трябва да приложи допълнителна обработка.

Подсказката се въвежда от страната на клавиатурата. SDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTCEYSТова ви позволява да деактивирате определени системни преки пътища, когато използвате суров вход, което е много практично за игри, които трябва да улавят клавишни комбинации без системна намеса. А на ниво GameInput API, SDL_HINT_WINDOWS_GAMEINPUT По подразбиране е деактивирано, което намалява потенциалните конфликти в някои среди, докато не бъде изрично конфигурирано.

Добавя се също SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER За да получите HMONITOR, свързан с екран, нещо много полезно, ако смесвате SDL с класически Win32 код и трябва да координирате прозорци или монитори.

macOS, iOS и visionOS

В macOS, SDL 3.4 включва много практичен съвет: SDL_HINT_MAC_НАТИСНЕТЕ_И_ЗАДРЪЖТЕТази настройка контролира дали задържането на клавиш повтаря натискането му или отваря менюто с акценти. Това ви позволява да регулирате поведението на клавиатурата за игри и приложения, които изискват бързо повторение на клавишите, вместо типичното меню с акценти в macOS.

На iOS, SDL сега поддържа прозоречни сцениТова разрешава предупреждението „КЛИЕНТЪТ НА UIKIT ИЗИСКВА АКТУАЛИЗАЦИЯ“ и привежда библиотеката в съответствие със съвременните практики на UIKit. Свойството SDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER е въведено, за да се укаже сцената на прозореца при създаване на SDL прозорец, което помага за правилното интегриране на приложението в системата за прозорци на iOS.

В visionOS и устройства като Apple Vision Pro, SDL 3.4 настройва поведението на прозорците и честотата на опресняване. Честотата на опресняване по подразбиране е увеличава се до 90 Hzосигурявайки по-плавно изживяване, а SDL_SetWindowSize() ефективно променя размера на прозореца на Vision Pro очилата, давайки по-голям контрол върху оформлението в среди със смесена реалност.

Linux, Wayland, KMS/DRM и Vulkan

В света на Linux, SDL 3.4 идва с много нови функции. От една страна, той добавя атомна поддръжка за KMSDRMТова подобрява стабилността и синхронизацията, като работи директно с графичната подсистема на ядрото. Във връзка с това, подсказката SDL_HINT_KMSDRM_ATOMIC позволява контрол върху това дали KMSDRM ще използва тази атомарна функционалност.

За Wayland е включено следното: SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTERТази функция ви позволява да получите wl_output, свързан с екран, което улеснява дълбоките интеграции с композитора. Освен това са отстранени проблеми с мишки с повече от пет бутона и е подобрено прецизното скролиране под X11, осигурявайки много по-прецизно усещане за контрол в приложения, които разчитат предимно на скролиране.

Що се отнася до Vulkan, SDL 3.4 въвежда пакетиране на рендериране и други подобрения за API-та, като Vulkan, което намалява излишните извиквания за рисуване и подобрява цялостната производителност. Работи се и по логиката, която открива По-мощен графичен процесор Vulkan В системи с множество графични процесори, това помага за автоматичен избор на най-подходящото устройство, особено в хибридни или лаптопни системи с интегрирани и специализирани графични процесори.

Освен това е добавено свойството SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER за конфигуриране на опциите на Vulkan при създаване на GPU устройство и SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN за изискване на хардуерно ускорение при създаването на въпросното устройство. На по-системно ниво SDL също е позициониран като X11 инструментариум с въвеждането на X11TK като собствен X11 инструментариум за SDL.

Emscripten и използване на браузъра

SDL 3.4 значително подобрява интеграцията си с Emscripten и изпълнение в уеб браузъриТова е ключово, ако искате да пренесете играта или приложението си в мрежата, без да го пренаписвате от нулата. Една от новите функции позволява на SDL прозореца да „запълни документа“, без непременно да е на цял екран.

В предишна версия беше въведен SDL_HINT_EMSCRIPTEN_FILL_DOCUMENT, а в окончателната версия е реорганизиран около флага. SDL_WINDOW_FILL_DOCUMENT и функцията SDL_SetWindowFillDocument(), заедно с няколко свързани свойства. Забележителни примери включват:

  • SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING и SDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING, за да зададете и заявите идентификатора на платното, използвано от SDL.
  • SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_FILL_DOCUMENT_BOOLEAN и SDL_PROP_WINDOW_EMSCRIPTEN_FILL_DOCUMENT_BOOLEAN, за да се посочи и провери дали прозорецът трябва да заема целия документ.
  • SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING и SDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING, за да се посочи и направи заявка за елемента, към който е свързан входът от клавиатурата.

Тези опции предлагат много фин контрол върху Как SDL се интегрира с DOM и платното (canvas)?Това помага да се избегнат хакове и междинни слоеве при работа с Emscripten. Те също така улесняват осигуряването на SDL съвместимост с уеб рамки или по-сложни интеграции, където платното е само една част от страницата.

PlayStation 2 и други по-рядко срещани платформи

Въпреки че може да е изненадващо, SDL 3.4 също обръща внимание на ветерани платформи като PlayStation 2Добавени са подсказки за контрол на параметрите на дисплея: SDL_HINT_PS2_GS_WIDTH, SDL_HINT_PS2_GS_HEIGHT, SDL_HINT_PS2_GS_PROGRESSIVE и SDL_HINT_PS2_GS_MODE, които ви позволяват да регулирате резолюцията, прогресивния режим и общите настройки на графичния синтезатор.

Тези подробности показват ясно, че SDL остава много гъвкав вариант за проекти за домашно приготвяне, емулация или проучване на по-стари платформи, освен силния си фокус върху съвременните компютри, мобилни устройства и уеб.

Управление на процеси, разрешения за камера и ELF метаданни

На системно ниво, SDL 3.4 добавя свойството SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_NIZТова се използва за конфигуриране на работната директория на новите процеси, създадени от SDL. Това опростява изпълнението на подпроцеси или външни инструменти от вашето SDL приложение, без да е необходим достъп до API на операционната система.

В областта на фотографията, SDL_GetCameraPermissionState() сега връща стойност от типа SDL_CameraPermissionState вместо общо цяло число, по-добро съгласуване на семантиката и улесняване на управлението на разрешенията на мобилни и настолни платформи.

В Unix системите SDL включва ELF бележки, които описват неговите незадължителни библиотечни съоръжения Следвайки формата, документиран на systemd.io/ELF_DLOPEN_METADATA, идеята е дистрибуциите да могат да анализират тези бележки и автоматично да генерират зависимости на пакетите, използвайки инструменти като package-notes. SDL предоставя макроса SDL_ELF_NOTE_DLOPEN, така че други библиотеки и игри да могат да правят същото, което улеснява много по-чисто управление на зависимостите.

Прогрес на прозореца и анимирани курсори

За да подобри потребителското изживяване, SDL 3.4 добавя функции, предназначени да показване на напредъка и обогатяване на интерфейсаНапример, SDL_SetWindowProgressState(), SDL_SetWindowProgressValue(), SDL_GetWindowProgressState() и SDL_GetWindowProgressValue() са въведени за показване на ленти за напредък на иконата на прозореца в лентата на задачите на Windows и Linux.

Тази функция позволява на потребителя да види състояние на дълга операция (изтегляния, качвания, вътрешни компилации и т.н.), дори ако прозорецът не е на преден план. Това е доста елегантен начин за предоставяне на обратна връзка, без да се налага проектиране на допълнителни HUD-ове.

От друга страна, SDL_CreateAnimatedCursor() позволява създаване на анимирани цветни курсориТова добавя нотка визуален блясък към игри или инструменти, където курсорът съобщава състояния (зареждане, възможно действие, предупреждение и др.). В комбинация с новата подсказка SDL_HINT_MOUSE_DPI_SCALE_CURSORS, която вече е по подразбиране „0“, за да се предотврати неочаквана промяна на размера на курсорите в среди с мащабиране на DPI, това осигурява по-предвидим контрол върху външния вид на показалеца.

С този набор от промени – от 3D/2D GPU интеграция, вградена PNG поддръжка, подобрения на входа и звука, до внимание към съвременния Linux, Emscripten, visionOS и класическите конзоли – SDL 3.4 затвърждава позицията си на... много пълен набор от инструменти за междуплатформена разработкаминимизиране на външните зависимости и предлагане на солидна основа, върху която да се извършват итерации, без да се губи цял ден в решаване на проблеми с отстраняването на грешки, несвързани със собствения ви код.