2012-08-01から1ヶ月間の記事一覧

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を書き忘れていて初期化されていなかっただけだった。よくそれで動いていたも…

mrubyのContextThreading化 その1

ちょっと前に間接分岐に関する記事を並べてみたわけだが、そもそも間接分岐自体を消してしまうテクニックも存在する。ContextThreadingという。これまた日本語の記事が無いのだが、軽い説明がこちらのブログにある。 http://d.hatena.ne.jp/higepon/20080510…

NaN boxingとsizeof(mrb_value)

mrubyはオブジェクトの型としてmrb_valueというものを使う。これは以下のような宣言になっている。 typedef struct mrb_value { union { mrb_float f; void *p; mrb_int i; mrb_sym sym; } value; enum mrb_vtype tt:8; } mrb_value;共用体valueに4つの型が…

ダイレクトスレッデッドコード化

速いのかどうなのかさっぱりわからないのでイマイチ自慢できないのだが、せっかくそれっぽく動いているので公開。 とりあえずswitch-case動かすようにコンパイルすると動かなくなるようなひどい修正。でも誰も困らない気がするのでそこまでやってない。この…

mrubyのコードジェネレータをいじる

先日のうちで動かしたベンチだが、bench2と3の場所を入れ替えたら2のほうが1.5倍ぐらい遅くなった。2と3はアセンブラレベルで命令は同じ(case0のaに代入する値が変わるだけ)なので、どうにもさっぱりわからない。mruby本体に手を入れると速くなったり遅くな…

IntelとAMDの間接分岐アーキテクチャ

ちょっと前にmrubyはダイレクトスレッデッドコードじゃなくてトークンスレッデッドコードだ、と書いた。じゃあ、ダイレクトスレッデッドコードを実装したらどうなるのか、ということで試していた。そもそもダイレクトスレッデッドコードとは何かと言うと、短…

GCCのインラインアセンブラと間接分岐

この記事を書いている途中に@miura1729さんがmrubyにインラインメソッドキャッシュを実装したという発言が。 https://github.com/miura1729/mruby/commit/ed3ef94a4a50946dfe237c27d53375cc4e31ca84 インラインメソッドキャッシュというのは命令列の中にメソ…

Cの演算子とビット演算関連の最適化

mrubyの最新版に実行速度改善の修正が入った。arena_aiを必要なところのみに入れる、while最適化、無駄なOP_LOADNILの削除、だ。 これによりtimesの命令列はこのようになった。 irep 150 nregs=6 nlocals=4 pools=0 syms=3 000 OP_ENTER 0:0:0:0:0:0:1 001 O…