shinokaro / sdl2binding

SDL2 for Ruby

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

sdl2binding

SDL2 for Ruby

Fiddle のみで実装した SDL2 のラッパー・ライブラリーです。 Ruby に標準添付されている Fiddle とマルチプラットフォームで動作する SDL2 を使用します。 確認は取れていませんが、Ruby と SDL2 が動作する環境であればこのコードは動作します。

私は Windows10 で開発し動作を確認しています。

使用するにあたって、まず SDL2 のライブラリーを準備してください。 次に、SDL2 モジュールの dlload メソッドに SDL2 ライブラリーへのパスを与えてください。 (私はこの手間を解消する方法を探しています。)

将来的に、これは GEM になる予定です。 しかし、C 言語による拡張コードを書くつもりはありません。 そのためコールバック関数を要求する関数は呼び出せないままになるでしょう。 (コールバック関数を必要とする関数は削除する予定です)

SDL2 は主にゲーム作成のためのライブラリーです。 しかし、ゲーム以外の用途にも使用できます。 私は Ruby にマルチメディア機能を与えるためにこのコードを書いています。 もちろん、Ruby と同じようにマルチプラットフォームで誰の手元でも動くことを望んでいます。

SDL2について

SDL の正式名称は Simple DirectMedia Layer です。 SDL2 は SDL のバージョン2を表しています。 SDL は http://www.libsdl.org/ からソースやコンパイル済みのライブラリーを入手することができます。 SDL のライセンスはバージョンによって違います。 1.2は GNU LGPL です。2.0からは zlib です。このバインディングは 2.0以降の最新版を対象としています。

SDL はマルチプットフォームのビデオ、音声、入力(キーボード等)の低レベルレイヤーアクセスのためのライブラリーです。 このライブラリーはOS毎の差異を吸収し、統一的なプログラミング方法を提供します。

サポートしているOSの一覧は https://wiki.libsdl.org/Installation に記載されています。 (サポートOS: Linux, Windows XP/Vista/7, Mac OS X, iOS, Android, SteamOS, Haiku, Raspberry Pi, NaCL, Emscripten, WinRT/Windows 8/WinPhone, Ouya)

SDL は主にゲーム開発に利用されています。しかし、利用方法はゲームに限りません。 SDL を使う事で OSを選ばずに動作するマルチメディア・アプリケーションを可能にします。 あなたのプログラムから直接、ハードウェア―を操作することができます。

マルチスレッド対応について

ハード、メディア操作を行う上でマルチスレッド・プログラミングは避けて通れません。 あなたがスレッドを全く使わないプログラムを書いたとしても SDL 側でスレッドが立ち上がり動作します。 スレッドは SDL 側と Ruby 側の双方に存在します。 それぞれを分けて考える必要があります。

SDL が提供するC関数は内部でロック処理を行う事でマルチスレッドに対応します。 SDL の幾つかの関数はマルチスレッドに非対応であることが明示されています。 どのみちユーザ側でスレッドを適切に設計(ロック処理)することが求められています。

Ruby 側のマルチスレッドはとても複雑です。Ruby のスレッド処理についての知識が必要です。 一方で、Ruby のマルチスレッド対応はライブラリー側で行う事も出来ます。 このバインディングでも可能な限りマルチスレッドの複雑さを吸収するのを目標としています。

このバインディングについて

SDL2 が提供する関数は全て SDL2 モジュールのシングルトン・メソッドとして提供してます。 これらのメソッドは C関数のままなので利用にあたってはポインターやC構造体などの知識が必要です。 これは Ruby 的ではありませんが、直接 SDL 関数を操作し OS やハードウェア―を理解するのに有効であると考えパブリックにしています。 SDL のソースにある定数や列挙体も用意してあります。 詳しい使い方は SDL のドキュメントをあたってください。 (SDL 関数の名前はそのまま使用しているので検索も簡単なはずです)

Ruby 側から使うために SDL の提供するリソースをクラス化したものも提供します。 SDL の提供するリソースはメモリーを確保します。 この確保したメモリーは不要になったら開放する必要があります。(そうしなければメモリー・リークを起こします) Ruby 的には当然、クラスのインスタンスが GC に回収される際には自動的に SDL 側のリソースも開放されるようになっています。 (そうなるようにするのがこのプログラムのゴールです)

Ruby クラス側ではリソースの自動開放を実現するために SDL の操作にある程度の制限がつきます。 この制限が邪魔な場合は SDL2 モジュールにある SDL 関数を直接呼び出してください。

幾つかの SDL 関数は全く使えません。 具体的にはSDL 関数がコールバック関数を要求し、このコールバック関数が SDL 側のスレッドから呼び出されるものです。 コールバック関数を Ruby のコードで用意することはできます。 しかし、Ruby は自身のスレッド外から Ruby のコードを呼び出す事を禁じています。 (具体的にはコールバック関数が呼び出された時点で回復不能なエラーになる) 将来的に Ruby から使う事の出来ない SDL 関数は SDL2 モジュールから削除されます。

Ruby から直接バインドした理由

Ruby から SDL を利用するライブラリーは既に存在しています。 これらは C 言語で書かれているためコンパイルが必要です。 ライブラリーを使用する前にコンパイルから始める必要があります。 これは Windows 環境の場合、大変な苦痛を伴います。 一旦、コンパイルに失敗すると解決には膨大な知識と世界中たった一人で問題を解決する必要があります。 (これを助けるには Ruby, SDL, Windows, C, コンパイルおよびエラー、全ての条件が一致する人である必要がある)

バインディングに Fiddle を使用した理由は Ruby の標準添付ライブラリーだからです。

私は画像を表示したり、音を奏でたりするのに難しいことは考えたくありません。 (それでさえ余計な知識を要求しています。)

課題(TODO)

  • ライセンスの明示。SDL2 と同じ zlib を考えています。
  • GEM化(ゴール)
  • SDL2 ライブラリーの指定、探索、提供方法。(SDL2 の特性上、明示指定は必ず必要)
  • SDL2 関数のカバー率を上げる。
  • ドキュメント、しかしこれは最後。OS やライブラリー特有の事柄も解説する必要があるため。
  • エンディアンの判定
  • FourCCに関するマクロ

About

SDL2 for Ruby


Languages

Language:Ruby 100.0%