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