目次 - FAQ - 開発

# FAQ:開発

## SDLはマルチスレッド対応か?

SDLはシンプルな多環境対応のスレッド生成とmutexを使った同期を行う関数を提供している. SDLはオーディオと入力のサブシステムの実装のため内部でこれらを使っている.

## マルチスレッドでSDLビデオ関数を呼べるか?

呼べない. ほとんどのグラフィックバックエンドはスレッドセーフではない. よって, SDLビデオ関数の呼び出しは, アプリケーションのメインスレッドからのみにする必要がある.

## SDLは3Dアクセラレーションに対応しているか?

SDLは3Dアクセラレーションに対応している:

- OpenGL APIまたはDirect3D APIを, SDLと組み合わせて, 2Dまたは3Dのグラフィックで使うことができる.
- または, 2Dグラフィックに対して, SDL_Textureで, OpenGLまたはDirect3Dアクセラレーションを使ったSDLの2DアクセラレーションレンダーAPI(しかし, OpenGL/Direct3Dを直接使うよりは簡単で, それら両方に対応している)を使うこともできる.

## SDLはネットワークに対応しているか?

ネットワークはSDLの範囲外である. しかし, SDLライブラリのページにあるシンプルな多環境対応のラッパーSDL_netを使えば可能である. シンプルなクライアント/サーバのチャットと, それを作成するためのシンプルなGUIライブラリも含まれている.

## SDLはPCX, JPG, PNG, ...に対応しているか?

SDLのBMPとWAVローダーによる画像と音声ファイルの読み込みの簡単なサンプルがある. その他の形式は自分自身でリーダーを作成する必要がある. メインのライブラリを速く小さくするため, これらの追加のローダーは含まれていない. SDLライブラリのページにあるシンプルな画像読み込みライブラリSDL_imageを使えば, BMP, PCX, GIF, JPG, PNG, TGA画像をSDLサーフェイスに読み込むことができる.

## SDLはMP3, Ogg Vorbis, ...に対応しているか?

SDLのBMPとWAVローダーによる画像と音声ファイルの読み込みの簡単なサンプルがある. その他の形式は自分自身でリーダーを作成する必要がある. メインのライブラリを速く小さくするため, これらの追加のローダーは含まれていない. SDLライブラリのページにあるシンプルな音声ライブラリSDL_sound(またはSDL_mixer)を使えば多くの異なる音声形式を読み込める.

## SDLは文字列の描画に対応しているか?

ゲームやオペレーティングシステムによって, 文字列の描画の種類や方法は大きく異なる. これをSDLライブラリの中核で扱う代わりに, SDLライブラリのページに文字列を描画するライブラリがいくつかある (例えばSDL_ttf). よくある方法には, ビットマップフォント, TrueTypeフォント, 画像の使用がある.

## SDLにはどのようなGUIがあるか?

SDLライブラリのページにいくつかのGUIライブラリがある (例えばGUIlib). SDLデモにはSDLとGTkを合わせて使うデモがあり, グラフィック出力をうまく扱えている(GTK-demo 1.2). デモページにはKent MeinによるSDLとTcl/Tkを使うハックもある(TCL-demo 1.1). SDLと合わせて使える他のGUIも入手できる. それらの多くにはドキュメントにどのようにツールキットを他のアプリケーションで使えるようにするかが書かれている.

## #includeは <SDL.h> と <SDL/SDL.h> のどちらが正しいか?

最も移植性の高いSDLヘッダのインクルードの方法は, ヘッダ名をダブルクオーテーションで囲む方法である:

`#include "SDL.h"`

## SDL_types.h内でSDL_DUMMY_ENUMアサーションが発生する

「列挙体をintとする」オプションを有効にする必要がある:

- フリーのBorlandコンパイラでは, コマンドラインに -b オプションを追加する.
- Watcom C/C++では, コマンドラインに -ei を追加する.
- AppleのMPW環境では, コマンドラインに -enum int を追加する.
- CodeWarriorでは, プロジェクトのC/C++言語の設定メニューで"Enums Always Int"ボックスをチェックする.

## アクセラレータービデオカードがあるにも関わらずSDLはビデオメモリもアクセラレーションもないと報告する!

全てのディスプレイ対象がハードウェアアクセラレーションに対応しているわけではない. 特にX11の場合は常にソフトウェアフレームバッファが使われる. アクセラレーションが使えない場合は, ビデオメモリは常に0と報告される. これは3Dアクセラレーションとは無関係で, 2Dアクセラレーションがオペレーティングシステムのビデオドライバで対応しているかの問題である.

Linuxでハードウェアアクセラレーションを使いたいならば, DGAドライバ(X11のフルスクリーンのみ)またはフレームバッファコンソールドライバ(コンソールのフルスクリーンのみ)を使うこともできる. これらのドライバの詳細はLinux FAQを参照すること.

Windowsでハードウェアアクセラレーションを使いたいならば, SDLがDirectX対応でビルドされていることを確認し, あなたのプログラムをフルスクリーンにすればよい.

O'Reilly NetworkにはBob PendletonによるSDLが扱うハードウェアの優れた記事がある.

## SDL_DOUBLEBUFを使っているがちらつく

もしウィンドウモードならば, フルスクリーンモードにする必要がある. フルスクリーンモードならば, ドライバが垂直帰線同期に対応していない可能性がある. NVidiaドライバでOpenGLを使っているならば, 垂直帰線同期をコントロールパネルまたは環境変数で有効にする必要がある.

O'Reilly NetworkにはBob PendletonによるSDLが扱うハードウェアの優れた記事がある.

## フルスクリーンモードのときマウスカーソルが消える!

これはビデオメモリに直接アクセスしていて, ビデオドライバがハードウェアによるカーソルの重ね合わせに対応していないとき発生する. 単純な解決方法は, スプライトとしてカーソルを生成し, マウスカーソルの位置にそれを描画することである.

## SDL Wikiへのリンク

FAQ: Development - SDL Wiki