2013-01-01から1年間の記事一覧

DXRubyWSサンプル

このあいだから作っているDXRubyWSにサンプルを追加しているのだが。 https://github.com/mirichi/DXRubyWS まあ、ゲームに組み込むユーザーインターフェイスを作ることは確かにできた。でもコードを見るとわかるがベタに書いたほうが短くなるんじゃないかと…

DXRuby1.5.2devリリース

DXRuby1.5.2devをWikiに置いた。 http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D5%A5%A1%A5%A4%A5%EB%C3%D6%A4%AD%BE%EC今回はちょこっとメソッド追加とバグの修正。主にメッセージループの別スレッド化が原因で発生していたものを直した。やっぱり基…

アリーナのかいしんのいちげき

mrubyにはmrb_gc_arena_save()/mrb_gc_arena_restore()という関数があって、これを使わずにCでオブジェクトを作りまくるとエラーでコケる。この件について作者のMatzが直々に日記を書いておられる。(http://www.rubyist.net/~matz/20130731.html#p01) mruby…

ウィンドウシステムを考える

ちょこっと作ってみたのでGitHubにて公開中。 https://github.com/mirichi/DXRubyWS GUIぽいものを作ってみようという試み。やりたいことは以下の2点で、どっちを重視するかと言うと悩むところではある。 ・ゲーム向けGUIのベース ・Rubyオブジェクトを目で…

Fiberを使いやすくする仕掛け2

実際にFiberSpriteを使って何か作ろうと考えたとき、ゲームに登場するキャラはFiberを使うものと使わないものに分かれることに気づく。たとえば敵キャラ全体のスーパークラスを作ったときに、その派生クラスがFiberを使うものと使わないものに分かれてしまう…

Fiberを使いやすくする仕掛け

RubyのFiberはコルーチンというかマイクロスレッドというか、ユーザが中断ポイントを指定して任意に切り替えられるスレッドなので、これを使うとパターンで行動するキャラの制御ロジックが書きやすくなる。 Fiberは生成時にコードが必要で、たとえばSpriteな…

mallocのはなし

mrubyのkhash.hでハッシュテーブルを生成するときのmallocを削ったパッチが取り込まれたので今日はmalloc記念日。 https://github.com/mruby/mruby/commit/cdb23edf312e868bad3a7f8e8fc1a8aa556bcf4a■mallocとfree Cで動的にメモリを確保するには、標準関数…

画像の縮小アルゴリズム

DXRubyの公式掲示板で拡大フィルタの話が出たので思い出した話をメモ。■拡大縮小のアルゴリズム 画像の描画はCPUでやってもGPUでやっても、元の画像をVRAMに転送することで行う。等倍の転送ならそのままになるが、3D描画ではドットバイドットの描画がされる…

mrubyのハッシュ

直してプルリしたら受け付けられたので喜びのメモ。ハッシュについて。 https://github.com/mruby/mruby/commit/00353a3c42e0a65fbf2e2b355535ff6fce2e872a#include/mruby/khash.hRubyではインスタンス変数やメソッドのテーブルはハッシュテーブルとして保持…

DXRuby1.5.1devリリース

主にウィンドウメッセージループの別スレッド化とRenderTargetの自動updateまわりの修正である。他はそんなに大きくは変わっていないが、開発版を出し惜しみする意味もないのでここでリリースしておく。http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D…

DLとWin32APIとFiddle

Rubyには外部のライブラリの呼び出しインターフェイスとしてDLというライブラリが添付されているが、Ruby2.0になってそれは廃止予定になってFiddleが追加された。他にWindows用にはWin32APIもある。このへんをまとめる。■Ruby1.8時代 Win32APIが独自実装で存…

扇形を描く

深い意味は無いのだけどシェーダを使って描画してみた。360度系なので0度(360度)をはさんだ場合がちょっと厄介。あとシェーダに渡す長さがピクセル単位にならないのも困りもの。このへんはメソッド作って内部で処理してやると簡単になるだろう。 require 'dx…

メジャーGCを減らす作戦

RGenGCやmrubyのシンプルな2世代管理の世代別GCでは、新世代オブジェクトはマイナーGCで1回マークされるだけで旧世代オブジェクトになる。この方式の利点は処理が軽いことで、欠点はマイナーGC実行時にタイミング悪く参照されていた一時オブジェクトが長寿命…

ライトバリアの改善策

RGenGCもmrubyも世代別GCなのでライトバリアがある。 どっちもたとえば配列aに新オブジェクトbをpushした場合に、配列aを記録しておいて後で探索するという動作をする。なぜbじゃなくaなのかと言うと、bは配列に突っ込んですぐ取り出して捨てる可能性があり(…

RGenGCとC拡張ライブラリの関係

Ruby2.1のRGenGCについて対応などを考えていたので個人的まとめ。■世代別GCとC拡張ライブラリの相性の悪さ RGenGCは世代別GCである。通常はRubyシステムによって適切に制御されたライトバリアと世代別管理されたGCによって効率よく処理されるが、C拡張ライブ…

世代別とインクリメンタル

mrubyでどのように実現しているのかを眺めてみたので把握したことを個人的メモ。■世代別GCとインクリメンタルGC mrubyでの世代別GCは全探索するメジャーGCと、差分探索するマイナーGCに分かれる。このうちマイナーGCはルートスキャンからスウィープまで一気…

tri-color inclemental gcの色

mrubyのgcを眺めていて把握したことを個人的メモ。mrubyは世代別GC+インクリメンタルGCなわけだが、このインクリメンタルGCはtri-color inclemental gcとコメントに書いてあるようにオブジェクトのマーク状態を色で表現している。3色で白、灰色、黒となって…

RubyとGCについて

思ったことをつらつらと支離滅裂な個人的メモ。1.シンプルマルチスレッドGCこのあいだからいじってるやつだが、とりあえず世代別GCがあるのとないので3倍も違うというのはおかしいのでまだどこかバグっているんじゃないかと思う。効率面での話なのでヒープ…

マルチスレッドGC実験その後

動きのおかしいコードをそのままにしておくのも気持ち悪いのできちんと動くように修正してみた。64指定のao-render.rbが34秒で動くようになったので相当おかしいことになっていたのだと思う。githubにあげたコードはあれこれいじっているが、バグっていた箇…

mrubyでマルチスレッドGCを実験する

githubがよくわかってないのでbranchとかがなんか変なことになっているような気がするのだが、それはさておき。 このあいだ、マルチコアを活用するマルチスレッドGCについてアイデアをひらめいたので、とりあえず手ごろなmrubyをいじって実験してみようと思…

gemを作ってみた。

よくわかっていないのだがほとんど手探りでgemを作ってみた。 gem install dxruby とすればインストールできるんじゃないかな。1.8/1.9/2.0用を含めてあるからどのバージョンでインストールしても動くのではないかと思う。1.8でgemからインストールするとreq…

Ruby2.0のprependでHitRangeを使う

DXRuby1.5devにはHitRangeモジュールをサンプルとして添付してあるが、これはSpriteを継承したクラスに対してincludeして使う。 RubyのModule#includeは実行されたときのself(つまりなんかのクラス)に対して、継承階層の上位にモジュールを挿し込む。といっ…

メッセージループの別スレッド化

Ruby1.9以降、スレッドはネイティブスレッドとなった。 DirectX9ではウィンドウを作ったスレッドとDirect3Dを初期化・Reset・Releaseするスレッドは同じでないといけないという制限がある。DXRubyではrequire'dxruby'した時点で内部的にウィンドウを生成し、…

Ruby2.0.0-mswin32版のDXRuby1.4.0

作ってみたのでWikiに置いといた。 http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D5%A5%A1%A5%A4%A5%EB%C3%D6%A4%AD%BE%ECRubyのmswin32版というのはVCでビルドしたRubyのうちmsvcrt.dllをリンクするバージョンであり、これを作るにはVC6.0が必要であ…

DXRuby1.5.0devリリース

GWを引きこもって大量の修正を入れていた。とりあえず一区切りという意味を込めて、DXRuby1.5.0開発版のリリースである。http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D5%A5%A1%A5%A4%A5%EB%C3%D6%A4%AD%BE%ECWikiにはついでにAyame/Ruby0.0.2も置い…

衝突判定範囲の描画

DXRubyEx用には作ってあったのだが、DXRubyにSpriteを追加してから衝突判定範囲を描画する機能が無かったので作ってみた。 これはDXRuby添付の衝突判定サンプルにコードを追加した画面だが、範囲が見えやすいようにSprite#collision_syncをfalseにしてある。…

レンダリング済みフォントを扱う

フリーのフォントはたくさんあるが、気に入ったものが再配布不可になっていたりすると困る。その場合、画像化したデータなら使ってもいい、というパターンは多いが、そうすると固定文字でしか扱えなくなってしまう。 例えば文字単位に画像を作って並べてやる…

レンダリング済みフォントサポートクラスサンプル

できた。 プロポーショナルフォントを扱う場合にはフォントのメトリクス構造体から情報を取ってきて描画位置を調整する必要があるのだが、アルファベットの小文字に特殊なやつ(fとかj)がいて、通常の領域をはみ出して描画することがある。 こういった文字を…

Ayame/Ruby0.0.2

3年以上あけてAyame/Rubyのバージョンアップである。 http://dxruby.sourceforge.jp/files/ayameruby002-mswin32-ruby19.zip 今回はAyame同梱のサポートクラスを使ってフェードイン/アウトと状態取得メソッドの追加およびMIDIファイルの再生に対応している。…

射影変換を考える

自分的メモ。 3D計算における射影変換は、単純に言えば奥のものを真ん中に寄せる計算である。奥のものを真ん中に寄せるためには座標をzで割ることになるが、それで真ん中に寄るということは、画面のど真ん中が座標系の原点(0,0)になっていないといけない。こ…