大林です。

<20010209132720.45087.qmail / cm603.mail.goo.ne.jp>の記事において
tamra / mail.goo.ne.jpさんは書きました。

>> 
>> 久しぶりになります、たむらです。
>> 
>> 先日話題になった SDL拡張モジュールを私も手がけてまして
>> ちっとも進んでないのですが、とりあえず公開しようと思います。
>> 
>> swig を利用してます。まだ画像表示系の簡単な関数だけですが、
>> 移植の感覚はつかめた気はしますが、クラス設計などをどうするかで
>> 止まってました。
>> 
>> 既に作業されてる方の実装やいろんな意見を聞きたいと思い発表します。
>> 
>> 現在、昼間はメールを送れる状況でないので、レスは ruby-list(ruby-ext ?)
>> にお願いします。夜自宅からならメールできますので。
>> 
>> たむら けんいち
>> 
ということなので、いろいろ書きます。

まず、クラスの構成について私の考えを書きます。
下の通りです。

module SDL
  class Error < StandardError  # SDLで生じるエラーを通知するクラス
  class Surface  # 画像を描きこめるフィールド
  class Screen < Surface  # ここに描きこまれた画像が表示される
  class Event  # キーやマウスなどをとりあつかう
  module Key  # Keysymを定義する
  module Mixer  # 効果音等を使えるようにする SDL_mixerのインタフェース
  class JoyStick  # ジョイスティックを取り扱う
  module WM  # ウィンドウを取り扱う
  class Font  

基本的にSDLのCに対するインターフェースをそのままRubyに移したような設計です。
これで問題はないと思います。


次に実装について箇条書きします。

SDLのAPIに近いインターフェースともっと単純なインターフェースを作る。
単純なほうのインタフェースはRubyで書いてもよいかもしれない。
音を出すのはSDL_mixerを使う。
SDLのスレッドは使わない。SDL_AddTimer等に対するインタフェースも提供しない。
SDLだけでは線を引いたり拡大縮小をする関数がないので、これは他の
ライブラリを使う。SGE と言うのが使えそうです。
あとswigでモジュール内モジュールは作れるのでしょうか。


最後に、私のSDL拡張ライブラリの実装時に起きた問題について書きます。

Linux上でSDLを普通にコンパイルしてインストールしたものを使って拡張ライブラリ
を作ると、うまくうごかなくなります。
具体的には、Rubyのスクリプト内でexitやraiseを使って実行を止めると、
きちんと止まらないというものです。

これはSDL内部でpthreadを使っていることが原因であるようです。
SDLのconfigureのときに --disable-pthreads というフラグをつけると、
この問題は生じないようです。
実験用の環境は Kernel 2.4.0 と 2.2.16 のものです。もともとは Vine 1.0 と
Plamo 2.0 alpha だったものですが、あちこちいれかえてあるのでよくわからなく
なっています。


上記の問題が解決したため、設計を修正して上に書いたように実装してある程度の
枠組を示せるようにして世に出そうと思っていたのですが...。

以上。
--
大林一平