SDL

URL: https://www.libsdl.org/
ライセンス: LGPL

概要

SDL とは Simple DirectMedia Layer の略で、その名が示すとおりアプリケーションからメディアを簡単にかつ直接的にいじるためのライブラリである。様々なプラットフォームをサポートしており、Linux・Windows・MacOS などの各種プラットフォームで動くソフトウェアを構築することを容易にする。

SDLの機能

SDL が何を簡単にしてくれているかを理解するには、次の例を考えると分かりやすい。マウスで絵を描くようなソフトウェアを作ろうとしたとき、普通に考えれば、ある程度の大きさのビットマップを画面上に表示し、そのビットマップはピクセル単位で色を変えられるようにしたいだろう。ところが、最近の高度なデスクトップ GUI システムでは、ウィンドウを一つ開くだけでも、長々と GUI システムの初期をしたりハンドラを取得したりと色々と関数を呼び出すことが要求されるため、大変面倒なことになる。また、ボタンやメニューを表示するのは一行で書けても、自由に書き換え可能なビットマップを表示するのはそう簡単ではない。これが一昔前なら、画面に表示されるグラフィックはすべてメモリ上のある特定領域から読み出されるという仕組だったので、何かを表示するのは非常に簡単であった。

SDLだと、ウィンドウを開くには初期化とビデオモードの宣言の2行で事足りる。またそのウィンドウは対応するビットマップ領域がすでに確保されているので、アプリケーションからは SDL から渡されたメモリ領域をいじるだけで簡単に絵を描くことができるようになる。

また、Linux・Windows・MacOS それぞれで、ウィンドウの開き方やマウスの座標取得の方法はまったく異なっており、それらに対処するのは面倒な手間が必要だったが、 SDL はプラットフォームの差異を吸収してくれ、同一の呼び出し手順で実現することができるようになっている。

現在 SDL が面倒を見てくれる機能は以下の通り。

また、追加ライブラリをインストールすれば、ネットワークアクセスや TrueType フォントの処理もサポートされる。

SDLが向いている場合

高度な GUI を必要とせず、ビットマップ主体でそれを描くための枠組が提供されていないような場合には、SDL は便利に使えるだろう。 また、画面表示のすべてを OpenGL で処理するような場合にも、SDL で省力化を図ることができる。

SDL が採用されているプロジェクトは SDL のページから見ることができるが、やはりゲームでの採用事例が一番多い。中でもスーパーファミコンの頃まで全盛だった 2D ゲームの開発において SDL は非常に便利だ。 また、レンダリングに OpenGL を使った 3D ゲームも、SDL を使ったものがよく見られる。

逆に、ボタンやメニューなどの GUI を存分に使いたいとか、曲線や楕円などの図形要素を駆使して絵を描きたいという場合には、 SDL の原始的なピクセル単位での描画では少々辛い。補助ライブラリを導入してなんとかすることも可能ではあるが、そういう要求がある場合には SDL は使わない方がよいだろう。

サンプル

以下のプログラムは、100x100の大きさのウィンドウを開き、左上から順番に白く塗り潰していき、右下まで辿り着いたらウィンドウを閉じて終了する。

    #include <SDL/SDL.h>

    int main()
    {
        SDL_Surface *screen;
        int x, y;

        SDL_Init(SDL_INIT_VIDEO);

        screen = SDL_SetVideoMode(100, 100, 32, SDL_SWSURFACE);

        for(y = 0; y < screen->h; y++) {
            for(x = 0; x < screen->w; x++) {
                *(unsigned int *)(screen->pixels + y * screen->pitch + x * 4) = 0xffffff;
                SDL_Flip(screen);
            }
        }

        SDL_Quit();

        return 0;
    }

関連