DXRubyの創り方

何かしらアウトプットしていかねば、ということで、連載記事「DXRubyの創り方」である。まあ、連載といっても順番に読めば理解が進むというわけでもなく、ターゲットを絞っているわけでもなく、思いついたときに思いついたことを書くからどうせ毎回レベルは違うわ濃さも長さも違うわみたいなことになるんじゃないかと思っている。体裁を整えることにパワーを注ぎ込むのは無駄だ。
今回はDXRubyというものを理解するにあたって、どういう情勢のときにどういう目的を持って、どのように開発されてきたのか、みたいな話。まあ、前書きみたいな?


DXRubyの開発開始は2007年ぐらいにさかのぼる。当時うちにあったPCはCeleronの750MHzとかが遅いノートだったようなぐらいで、Pentium3が世の中の主流という感じだった。Rubyは1.8系。DirectXはもちろん9.0c。
そのような状態で、Rubyを使ってアクションゲームを作れたらラクだろうなと考えたわけだ。3Dはさっぱりわからんかったから2Dにしよう。DirectX9の時代だから当然ハードウェアによる3D描画で2D描画したほうが速いだろう。そんな感じ。言うまでもなくネックになるのはハードウェアとRubyの性能で、当初のDXRubyは描画は遅いわRubyは遅いわで100個もオブジェクトを動かしたら60fpsは無理だね、というレベルであった。
そういう状況だったからこそ、DirectX9の使い方を試行錯誤して描画速度を稼ぎ、Rubyの動きを調べてなるべく実行速度を稼げるようなライブラリの仕様を作り、なおかつ自分が使うときに使いやすい形にする、というのが大きな目標になり、それそのものがDXRubyの存在意義になったわけだ。今ならCPUもビデオカードRubyも速いから、あまり苦労しなくてもそこそこ動くものが作れるんじゃなかろうか。

DXRubyの基本思想は「ライブラリは軽く基本的な処理に限定して、Ruby側でいろいろ書く」。Rubyは簡単だから、ゲームそのもののフレームワークなどそっちで書いてくれ、ということだ。もちろん俺自身がそういうのが作れない素人だから、作って提供したら悲惨なことになるだろうと想定してのことだ。
最初はほんとに何もなかった。が、例えば描画順ソートなどをRubyでやってみたら死ぬほど遅くて、これはCで書かないとゲームが作れないという感じでCで書いた。それでも60fpsを保つのは難しいだろうということでフレームスキップの制御なども入れた。これはたぶん今では必要ないから消してもいい気がする。
基本的なImage編集関連の処理も、Rubyでやればいいじゃーんって思ってたのだが、まったく現実的じゃなかったからCで書いた。この部分は画像データをロックして編集するのだが、アドレス計算が間違っているとOSごと落ちるから凄まじく大変であった。
音関連ではすでに息してない状態のSoundEffectに手間がかかっている。音の理屈として理解していることを実装してみたという感じのものだ。使っている人を見たことが無い。俺も使ってない。クラスまるごと消してもいいんじゃないかしらん。

この連載(になるのかどうか怪しいが)では、DXRubyの内部構造と仕組みを思想&Cレベルで説明することになる。かもしれない。知らんけど。
ネタとして考えているのはまずなにより描画系。Ruby側から呼ばれた場合の処理をいかに軽くするか、データ構造をどうするか、それを使ってDirectXでどう描画するか。テクスチャをどう管理するか。描画予約やソート、メモリ管理といったあたりの、DXRubyをとりまく状況と選択。
もっと基本の処理として、Windowsのウィンドウ管理やメッセージ処理。Rubyオブジェクトの管理など。
音関連。DirectMusicはよくわからんコピペコードだけど、DirectSoundを使うSoundEffectクラスの理論と実装など。
バイスの入力を実装しているInputモジュール。パッドとキーボードを関連づける仕掛けやオートリピートの実装。
新しい機能としてのRenderTargetとShaderの仕掛け。Spriteの設計判断と衝突判定まわり。
まあ、たぶん色々脱線するし思いつきでネタは追加されるしひょっとしたらいきなり飽きるかもしれんけれども、何かをしようと思って行動に移してみたところは素直に自分を評価したい。この時点で評価できるレベルではまったく無いのだが。

開発終了でまとめに入ったとか、そういうことは無いと思うので念のため。次を考え始めるまでにはまだ間があるし、やりたいことも残ってる。そのうちやるんじゃないかな。