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

衝突判定の外側

Spriteの衝突判定では、まず全オブジェクトのAABBボリュームを計算して保存し、それを判定する。AABBの算出はそれなりに負荷がかかるから、これを保存するのは効率的に必要な処理だ。Spriteは複数の衝突判定範囲を持つことができるから、SpriteのAABBを算出…

Spriteと衝突判定

DXRuby1.4で導入されたSpriteクラスはほぼデータ保持用という作りになっている。かろうじて描画機能があるが、結局のところ通常の描画機能と比べて描画用のパラメータを引数で渡すか、オブジェクトが保持している値を使うかの違いでしかない。この部分に関し…

文字描画関連その4

Win32でフォントを扱う場合、APIのCreateFontIndirectにフォント情報構造体を渡してフォントハンドルを受け取り、それをつかってGDIで描画する。このフォント情報構造体というのが微妙にあいまいで、指定のフォントが無い場合に最も近いフォントをOSが選択し…

文字描画関連その3

DXRubyでわりと最近追加したメソッドがRenderTarget/Imageのdraw_font_exだ。これはImage#draw_fontのようにGetGlyphOutlineWで受け取ったビットマップ情報を使って、影や縁取りを行う機能が追加されている。Imageのほうは地味だが厄介な編集処理が入ってい…

文字描画関連その2

フォントと文字描画の扱いで問題になるのはエンコードとレンダリング処理である。Ruby1.8用の場合はエンコードは決め打ち、1.9ならRubyの機能で変換すればいい感じにはなる。残る問題はレンダリングだ。 WindowsのAPIとかDirectXのD3DXFontとかを使うと文字…

文字描画関連その1

CPUとGPUは半導体なので、すごい勢いで技術が進歩している。主に製造プロセスの進歩と、それに伴い増えたトランジスタをどう使うかという部分での性能強化だ。ただし、CPUに対してGPUのほうが性能の伸びがずいぶん大きい。この違いは載せている回路の使い方…

RenderTargetの生成と解放

DXRubyの描画予約順ソートはマージソートを採用している。初期の頃はシンプルなバブルソートだったのだが、さすがにアレなのでマージソートに変更したのだ。なぜマージソートを選択したのかというと、描画優先順が同一だった場合、メソッドを発行した順に描…

描画予約用メモリ管理

RenderTargetがCPUから編集できないタイプのデータであることは何度か書いたのだが、その原因のあたりの話を少々。 DirectX9時代のGPUはCPUとのアドレス共有機能が無くて(いまでも無いけど)、ビデオメモリにしかアクセスができない。GPUからテクスチャを書き…

RenderTargetのDirectX的描画処理

DXRubyはいろいろな機能を詰め込んではあるが、基本は描画まわりである。音に関しては別のライブラリを使うという選択肢があるし、入力はWin32APIを使ってどーにかすればなんとかなるんじゃないの、と言ったところで、でもDirectXによる描画だけはどうにもな…

RenderTargetの構造と描画予約

DXRubyは1.2からRenderTargetを導入したおかげで、内部的にはWindowモジュールが一つのRenderTargetオブジェクトを持つようにして、そいつをスクリーンバッファに関連付けて使うように変更した。こうすることでWindowモジュールのdraw系メソッドは内部Render…

Imageオブジェクトの生成と解放

RubyのGCはマーク&スウィープで、Ruby1.8時代からするとずいぶん改善されていてはいるが、それでもやっぱりGCが動くとプログラムは停止するし、逆にGCが動くまではオブジェクトは回収されない。 DXRubyを使うほうとしては初期のころはGCでずいぶん苦労したも…

Imageとテクスチャ

最近のGPUはビデオメモリが数GBとかになっていて、普通にテクスチャを置く程度ならいくらでも置けるようになってきている。とはいえ安いものでは少ないのもあるし、APUとかチップセット内蔵とかになるとメインメモリ共有になってたりもするし、ビデオメモリ…

DXRubyの創り方

何かしらアウトプットしていかねば、ということで、連載記事「DXRubyの創り方」である。まあ、連載といっても順番に読めば理解が進むというわけでもなく、ターゲットを絞っているわけでもなく、思いついたときに思いついたことを書くからどうせ毎回レベルは…

グラデーションフォント

NScripter2の記事を見ていてこういう描画ができたらいいなーと思ったので試してみた。 http://naokitakahashi-dev.blogspot.jp/2012/08/nscripter2.html?zx=670ac5de0cb5d31b 今回は文字列を扱うからRuby1.9限定になる。1.8の人はちょっといじる必要があるか…

カドの丸いbox

最近Nexus7を買ったのでAndroidの勉強をしているわけだが、その中でカドの丸い四角の描画というのを見て、DXRubyで実現してみようと思った。 C側で書くならImage#circleのロジックとimage#boxのロジックをごちゃっと混ぜればできそうだが、よく考えたら今のD…

SLGの移動可能範囲算出

シミュレーションゲームはマスに移動コストが決められていて、キャラの移動量からどのマスに移動できるかというのを計算して、その範囲を表示してあげる必要がある。 表示しないと不親切極まりない。 逆に、ユーザーがいちいち数えて移動先を選択して、移動…

イライラ棒的なもの

DXRuby1.4.0のSpriteは画像の回転・スケーリングに同期した衝突判定がミソで、矩形だろうが三角形だろうが回転して他の形状との判定ができる。 これを利用すると、使わない場合には大変面倒な衝突判定が発生するようなモノも気軽に作れる。 ためしにイライラ棒的…

Shaderを使って点線

昔、Window.draw_exを使って線を引くコードを書いた。 http://d.hatena.ne.jp/mirichi/20100622/p1 今だとWindow.draw_lineがあるからこのような細工はしなくていいが、Shaderを組み合わせればもっと高度な線が引けるのではないかと思って試してみた。 まあ…

DXRuby1.4.0リリース

DXRuby1.3devを作り始めたのが3月だったので、5ヶ月ほどかかった計算になる。そんだけの時間でShaderと衝突判定を再実装したと考えると頑張ったほうかもしれない。 ブログには前からちょこちょこ書いてるから改めて言うことでもないが、DXRuby1.4.0の目玉はS…

mrubyのattr系メソッドの速度(2)

「attr系メソッド使うとすごく遅いからgetter/setterは自分で書いたほうがいい」とかいう話になると、Ruby的にはあまり喜ばしくない。 mrubyはターゲットが組み込みだったり、ゲーム用途も視野に入っているということなので、そういうことを気にする人という…

mrubyのattr系メソッドの速度

mrubyのbenchmarkディレクトリにao-render.rb(AOベンチ)があるわけだが、このコードを見ると例えばVevtorクラスのgetter/setterは自前で定義されている。作った人(@miura1729さん)によると元はytl用のものでattr系メソッドが無かったからということなのだが…

DirectXとRuby1.9の相性

ずいぶん前になるが、DXRubyでThreadを使うと動かないという話をどっかで見た。それも複数。 んで、手元でこんなコードを書くと、 require 'dxruby' image = Image.new(100,100,C_WHITE) rot = 0 th = Thread.new do loop do sleep 0.01 rot += 1 end end fo…

SDL_imageとmrubyを使ってみた

なんでもSDL_imageというやつを使わないとPNGとかJPEGは扱えないらしい。bmpだけというわけにもいかないのでそれをインストールしようとまたも試行錯誤。 まずSDL_Imageのソースをゲット。 http://www.libsdl.org/projects/SDL_image/ configureしたらなんか…

mrubyのop_enter_optimizeの話

一昨日、mrubyにNaN boxingが実装された。 https://github.com/mruby/mruby/commit/7d02df3016b0c6eb3f4ee945198772cf4ebca3fa 前に俺が試したナンチャッテNaN boxingではttが32bitのためにMRUBY_OBJECT_HEADERが大きくなっていたり、その他未解決の問題がい…

mrubyで知識0から始める試行錯誤GCC+SDL+OpenGLプログラミング

とりあえずコンパイルができて何とかなりそうな気がしたので、いじった結果を書いていくことにする。タグを新設しておいた。 うちで普段書くプログラムはRubyか、VCを使ったCになる。あとWin32APIとDirectX9。そんな俺がGCCを使ってSDL+OpenGLのmrubyアプリ…

mrubyのContextThreading化 その5 最終回

こまごまとした修正と若干のパフォーマンスチューニングを入れて、O3コンパイルでmake testを通過できるようにしておいた。 https://github.com/mirichi/mruby/tree/ct この時点でAOベンチ(O3コンパイル)比較は 元のmruby:6分8秒(368秒) ContextThreading:…

mrubyのContextThreading化 その4

例外を処理するには現在のContextThreadingの仕掛けでは致命的な問題がある。ブロックの呼び出しにCPUスタックを使ってネストしたcall命令で処理しているところだ。 もともと、mrubyのVMではブロックの呼び出しにcallinfoとgotoを使っていてCPUのスタックを…

mrubyのContextThreading化 その3

不具合も解消したので未実装のものをどうにかする。とかいいつつ、実装しなければならないモノがどれだけあるのかわからないので目標をAOベンチ完走に置いて、動かないところを調べていった。 昨日の時点で未実装の機能はメソッド途中のOP_RETURNと、引数省…

GCCとcdecl規約とmrb_value

mrubyのContextThreading化で大変なバグを2つ見つけた。それを直したらブロックの呼び出しができるようになって、mrblibを含めたmrubyが作れた。 一つはOP_JMPIF/OP_JMPNOTのVM命令側で、ここに書くのも恥ずかしいのだが、昨日の記事に書いたコードがすでに…

mrubyのContextThreading化 その2

前回に引き続きmrubyをContextThreading化する。基本命令が動作するところまではできたので、次はOP_JMP系だ。 そのまえに、ローカル変数が動かなかった件は解決した。単純にi=*pcを書き忘れていて初期化されていなかっただけだった。よくそれで動いていたも…