SDL

SDL（Simple DirectMedia Layer）直譯為簡單直接媒體層函式庫是一套開放原始碼的跨平台多媒體開發函式庫，使用C語言寫成。SDL提供了數種控制圖像、聲音、輸出入的函式，讓開發者只要用相同或是相似的程式碼就可以開發出跨多個平台（Linux、Windows、Mac OS X等）的應用軟體。目前SDL多用於開發遊戲、模擬器、媒體播放器等多媒體應用領域。

SDL（第一版）使用GNU寬通用公共許可證為授權方式，意指動態連結（dynamic link）其函式庫並不需要開放本身的原始碼。因此諸如《雷神之鎚4》等商業遊戲也使用SDL來開發。而第二版的SDL則改用Zlib授權來發行授權。

## 歷史

Sam Lantinga於1998年爲Loki Software工作時開發了SDL，並首先利用SDL將《毀滅戰士》移植到BeOS作業系統。他於2008年創立 Galaxy Gameworks 幫助SDL商業支持，因為時間限制該公司計劃被擱置。在Galaxy Gameworks擱置後不久，Lantinga 宣布 SDL1.3(之後成為 SDL2.0)將以 Zlib授權。Lantinga 於2012年7月14日宣布 SDL 2.0，同時宣布他即將加入Valve 公司，在他加入公司同一天發表第一個SDL版本。Lantinga在2013年8月13日發布SDL 2.0.0的穩定版。

SDL 2.0是一個重大更新，與 SDL 1.2 有很多不同，API不能向後相容。

新增一些功能：多視窗的支持，2D圖形硬體加速，更好的Unicode支援。

從 SDL 2.0.2 開始支援 Mir 和 Wayland。（但預設仍然是關閉的）

即將到來的 2.0.4 將會提供 Android 更好的支援。

## 結構與特色

<image>

雖然SDL時常被比較為『跨平台的DirectX』，然而事實上SDL是定位成以精簡的方式來完成基礎的功能，它大幅度簡化了控制圖像、聲音、輸出入等工作所需撰寫的程式碼。但更高階的繪圖功能或是音效功能則需搭配OpenGL和OpenAL等API來達成。另外它本身也沒有方便建立圖形使用者介面的函式。

SDL在結構上是將不同作業系統的函式庫再包裝成相同的函式，例如SDL在Windows平台上其實是DirectX的再包裝，舊版本包裝的是DirectX 5，SDL 1.2則是DirectX 7。而在使用X11的平台上（包括Linux），SDL則是與Xlib函式庫溝通來輸出圖像。

雖然SDL本身是使用C語言寫成，但是它幾乎可以被所有的程式語言所使用，例如：C++、Perl、Python（藉由pygame函式庫）、Pascal等等，甚至是Euphoria、Pliant這類較不流行的程式語言也都可行。

SDL庫分為 Video、Audio、CD-ROM、Joystick 和 Timer 等若干子系統，除此之外，還有一些單獨的官方擴充函數庫。這些庫由官方網站提供，並包含在官方文檔中，共同組成了SDL的「標準庫」：

- SDL_image—支援時下流行的圖像格式：BMP、PPM、XPM、 PCX、GIF、JPEG、PNG、TGA。
- SDL_mixer—更多的聲音輸出函式以及更多的聲音格式支援。
- SDL_net—網路支援。
- SDL_ttf—TrueType字體渲染支持。
- SDL_rtf—簡單的RTF渲染支持。

## 語法與子系統

SDL將功能分成下列數個子系統（subsystem）：

- Video（圖像）—圖像控制以及執行緒（thread）和事件管理（event）。
- Audio（聲音）—聲音控制
- Joystick（搖桿）—遊戲搖桿控制
- CD-ROM（光碟機）—光碟媒體控制
- Window Management（視窗管理）－與視窗程式設計整合
- Event（事件驅動）－處理事件驅動

以下是一支用C語言寫成、非常簡單的SDL範例：

```C
// Headers
#include "SDL.h"

// Main function
int main(int argc, char* argv[])
{
    // Initialize SDL
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
        return(1);

    // Delay 2 seconds
    SDL_Delay(2000);

    // Quit SDL
    SDL_Quit();

    // Return
    return 0;
}
```

上述程式會載入所有SDL子系統（出錯則退出程式），然後暫停兩秒，最後關閉SDL並結束程式。

## 與DirectX比較

與DirectX比較對應關係如下：

SDL｜DirectX｜說明

SDL_Video、SDL_Image、OpenGL｜DirectDraw、Direct3D

SDL_Audio、SDL_Mixer｜DirectSound

SDL_Joystick、SDL_Base｜DirectInput

SDL_Net｜DirectPlay

SMPEG、SDL_Video、SDL_Audio、SDL_Sound、SDL_Filter｜DirectShow

## 使用SDL開發的作品

### 開發實例

<image>

- Unknown Horizons

<image>

- 0 A.D.

<image>

- Hedgewars

<image>

- Frets on Fire

<image>

- OpenTTD

<image>

- The Battle for Wesnoth

<image>

- Oolite

<image>

- Secret Maryo Chronicles

<image>

- Trine

## 其他

### 遊戲

- 《Spore》
- 《Tux Paint》
- 《Simutrans》
- 《Frozen Bubble》
- 《絕冬城之夜》（Neverwinter Nights）
- 《魔法門之英雄無敵III》（Heroes of Might and Magic III）（Linux版）
- 《模擬城市3000》（Sim City 3000）（Linux版）
- 《魔域幻境之浴血戰場》（Unreal Tournament）（Linux版）
- 《魔域幻境之浴血戰場2003》（Unreal Tournament 2003）（Linux版）
- 《魔域幻境之浴血戰場2004》（Unreal Tournament 2004）（Linux版）
- 《第二人生》（Second Life）（Linux版）
- 《傭兵戰場》（Soldier of Fortune）（Linux版）
- 《韋諾之戰》（Battle for Wesnoth）
- Bos Wars

### 老遊戲的開源實現

- SDLPAL - 仙劍奇俠傳的引擎的開源實現
- CorsixTH - 杏林也瘋狂的引擎的開源實現
- kys-pascal - 金庸群俠傳的引擎的開源實現（PASCAL語言）
- kys-cpp - 金庸群俠傳的引擎的開源實現（C++語言）

## SDL的延伸

- pygame—針對遊戲開發的Python模組
- SMPEG—SDL MPEG函式庫
- Guichan—遊戲使用者介面開發函式庫
- ParaGUI—使用者介面開發函式庫
- CRM32Pro—遊戲開發包（SDK）
- SDL.NET—使用Ｃ＃的.NET包裝
- SFML

## 基本資料

- 日語原文：Simple DirectMedia Layer
- 開發者：Sam Lantinga
- 養護：Sam Lantinga
- 發行日期：1998年
- 軟體版本週期：3.2.14
- 作業系統：跨平台
- 類型：API
- 許可協議：Zlib授權、2.0.0前：GNU較寬鬆公共許可證（LGPL）
- 網站： libsdl.org