
如果你從事視訊遊戲開發或跨平台多媒體應用開發,你可能聽說過 SDL。 到貨 de 雪迪龍3.4該程式庫在圖形功能、平台支援以及用於優化桌面、Web 和行動裝置使用者體驗的工具方面實現了顯著提升。這並非一次小幅更新:它涵蓋了從 2D 渲染引擎和 3D GPU API 到音訊處理、驅動程式、筆輸入、現代 Linux 系統等方方面面。
儘管 SDL 3 仍在不斷發展,但該分支 3.4 版本表現得非常穩定。 SDL 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 生態系統及其運行時的整合也得到了優化,這對於面向 Steam 分發的 Linux 遊戲和跨平台開發至關重要。
3D GPU API 與 2D 渲染之間的互通性
SDL 3.4 的優勢之一是提升了… 3D與2D的融合該庫引入了用於創建基於 GPU 的 2D 渲染器以及在 GPU 紋理和 SDL 處理的像素格式之間交換資訊的新功能。
- 它增加了 SDL_CreateGPURenderer() 建立一個利用底層 GPU API 的 2D 渲染器。
- 同 SDL_GetGPURendererDevice() 您可以檢索與該渲染器關聯的 GPU 裝置。
- 他們加入 SDL_CreateGPURenderState(),SDL_SetGPURenderStateFragmentUniforms()、SDL_SetGPURenderState() 和 SDL_DestroyGPURenderState() 用於在 2D GPU 渲染中使用片段著色器。
- 現在他們被接納了 YUV紋理與HDR色彩空間 在基於 GPU 的 2D 渲染器中,這對於高階影片和內容來說尤其有趣。
它還包含以下功能: SDL_GetGPUDeviceProperties()此函數傳回 GPU 裝置屬性,包括裝置名稱、驅動程式名稱和版本,以及其他與相容性或診斷決策相關的資訊。此外,`SDL_GetPixelFormatFromGPUTextureFormat()` 和 `SDL_GetGPUTextureFormatFromPixelFormat()` 函數也有助於在 GPU 紋理格式和 SDL 像素格式之間進行轉換。
同時,該房產也包含在內。 SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER 若要從現有的 GPU 紋理建立 2D 紋理,可以使用 SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER 函式取得與 2D 紋理關聯的 GPU 紋理(在使用 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 格式。
- 同 SDL_LoadSurface() SDL_LoadSurface_IO() 會自動偵測檔案是 BMP 還是 PNG,並將其載入到表面上,而無需您擔心格式問題。
這種綜合支持轉化為 更少的依賴項和外部配置當為多個平台編譯或在 Emscripten 等環境中使用 SDL 時,這尤其有用,因為減少輔助函式庫的數量會對二進位檔案的大小和複雜性產生影響。
輸入方式:滑鼠、觸控筆、手勢和螢幕鍵盤
SDL 3.4 顯著改善了與以下方面相關的所有面向: 進階輸入設備在滑鼠領域,引入了 SDL_SetRelativeMouseTransform(),它允許對相對滑鼠輸入應用自訂變換,這對於縮放技術、軸反轉或特殊映射非常有用。
關於鉛筆和觸控筆,似乎 SDL_GetPenDeviceType()這樣一來,你就可以區分筆是直接在螢幕上操作還是在單獨的觸控板上操作,這是一個根據裝置類型調整使用者體驗的非常有用的細節。
在有虛擬鍵盤的裝置上,SDL 會新增諸如以下事件: SDL_EVENT_SCREEN_KEYBOARD_SHOOWN 以及 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_PutAudioStreamPlanarData() 在處理音訊串流時提供了更多選擇:前者在某些情況下避免了不必要的複製,後者允許以平面格式而不是交錯格式輸入數據,非常適合高級流或與高級音訊處理庫整合。
此外,SDL_HINT_AUDIO_DEVICE_RAW_STREAM 提示至關重要:此提示表示作業系統 你不應該對音頻進行額外的處理。 (例如降噪)。如果您的應用程式或遊戲已經處理了音訊處理,並且您不希望作業系統幹預並扭曲處理結果,那麼這一點至關重要。此外,還引入了 SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN,它允許某些音訊流在音訊子系統的生命週期結束後繼續存在,這在更複雜的架構中非常有用。
HID控制器和設備
SDL 3.4 顯著提升了對控制器和 HID 設備的支持,擴展了無需外部配置即可開箱即用的硬體範圍。特別是,它新增了… 改進了對 8BitDo 控制器的支持FlyDigi 和 Hand Held Legend SINput 使得許多第三方遊戲手把更容易穩定地工作。
也被納入其中 有線任天堂Switch 2手把支架 當 SDL 與 libusb 一起編譯時,對於偏好直接連接而非無線模式的使用者來說,這非常有用。在 HID API 層面上,SDL_hid_get_properties() 函數似乎可以將 SDL 屬性與 HID 設備關聯起來,而 SDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER 屬性允許在 SDL_hid_device 被 libusb 開啟時,檢索與其的 libusb 位元柄。
除了這些改進之外,SDL 3.4 還包含以下內容: 支援新款Steam控制器 在其入門級生態系統中,這與它在 Steam 運行時中的角色以及專注於 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 以及前面提到的捏合事件,從而為動態 UI 場景提供了更全面的事件生態系統。
從利潤來看, 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 的軟體光柵化器)。這在沒有相容 GPU 的機器上,或者在沒有直接加速但仍然想使用 API 的虛擬化環境中非常有用。
WASAPI驅動程式利用了 SDL_HINT_AUDIO_DEVICE_STREAM_ROLE 為了調整音訊串流類別,這是實現系統一致性行為(例如,遊戲音訊、通訊等)的重要整合。它還依賴 SDL_HINT_AUDIO_DEVICE_RAW_STREAM 來指示驅動程式是否應套用額外的處理。
提示訊息透過鍵盤輸入。 SDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS這樣一來,在使用原始輸入時,您可以停用某些系統快捷鍵,這對於需要捕獲按鍵組合而又不希望受到系統幹擾的遊戲來說非常實用。在 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_PRESS_AND_HOLD此設定控制按住某個鍵是重複按鍵還是開啟重音選單。這樣,您可以針對需要快速重複按鍵的遊戲和應用程式調整鍵盤行為,而不是使用 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 引進了 渲染批次處理 以及其他針對 Vulkan 等 API 的改進,這減少了冗餘的繪製調用,提高了整體效能。此外,還在改進檢測邏輯。 更強大的 Vulkan GPU 在具有多個 GPU 的系統中,自動選擇最合適的裝置很有幫助,尤其是在具有整合式顯示卡和獨立顯示卡的混合型或筆記型電腦系統中。
此外,新增了 SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER 屬性,用於在建立 GPU 設備時配置 Vulkan 選項;以及 SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BLEANATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BLE 裝置時,用於啟用硬體設備時。在系統層面,SDL 也被定位為… X11 工具包 引入了 X11TK 作為 SDL 的 X11 工具包。
Emscripten 和瀏覽器使用
SDL 3.4 顯著改進了其與…的集成 Emscripten 及其在網頁瀏覽器中的執行如果您想將遊戲或應用程式移植到 Web 平台而無需從頭重寫,這一點至關重要。其中一項新功能允許 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 使用的畫布的 ID。
- 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 時避免使用 hack 手段和中間層。此外,它們還能更輕鬆地確保 SDL 與 Web 框架或更複雜的整合(其中 canvas 只是頁面的一部分)的兼容性。
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仍然是一個非常靈活的選擇。 自製專案、模擬或研究 除了專注於現代 PC、行動裝置和網路平台外,在較舊的平台上也存在問題。
進程管理、相機權限和 ELF 元數據
在系統層面,SDL 3.4 新增了此屬性 SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING此設定用於配置從 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 鞏固了其作為…的地位。 一個非常完整的跨平台開發工具箱最大限度地減少外部依賴,並提供一個堅實的基礎,使用戶能夠迭代開發,而無需花費整天時間調試與自身程式碼無關的問題。
