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

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…

x86とGCCと分岐と私

mrubyのVMはoptableに命令と実際のアドレスの変換テーブルをおいて、gotoのときにそれを使って変換→ジャンプをしているのでダイレクトスレッデッドじゃなくてトークンスレッデッドじゃないのかと思う今日この頃。識者の意見求む。 今回はCPUのアーキテクチャ…

コードジェネレータとwhileアルゴリズム

最近mrubyをいじって遊んでいるわけだが、mrubyを気合入れて速くするぜ貢献するぜ、という感じではなくて、どのように変更を加えたらどのぐらい速度が変わるのか、を色々試している感じ。だからとても取り込まれそうにない修正もするし、すぐにでも取り込め…

mrubyのOP_SENDとブロック引数

いまのところ興味はVMのパフォーマンスのみ。昨日ためしたことを忘れないうちに残しておく。まずちょっと気になったFloatオブジェクトのサイズから。 mrubyはmrbconf.hを変更することで設定を変えてコンパイルすることができる。正規表現や標準入出力などを…

GCCの勉強とmruby

最近ちょとmrubyのコードを見たりしていた。ついでにGCCの使い方を勉強しつつ、吐き出すアセンブラを眺めてみたり、そんな感じ。 勉強がてらVMまわりを少しいじってみたので自分用メモを残しておく。

衝突判定のサンプル

1.2まではDXRubyEx用のサンプルとして含めてあったものを、Spriteを使うようにして、ついでに回転できるようにした。 わかりやすくて良いサンプルかというとちょっとよくわからないが、衝突判定のテスト用には使える。 #!ruby -Ks require "dxruby" # しかく…

DXRuby1.2.3リリース

微妙にハンパなリリースではあるが、1.2系最新版。中身は1.3dev開発中に追加した色々のうち、Shader/Sprite/アナログ入力以外をバックポートしたものである。これにより、そのうちリリースすることになるはずの1.4.0は1.2.3と比較して左記の機能追加のみが差…

Rubyからマシン語を直接呼ぶ

Ruby1.9のDLで。 require 'DL' str = "\xb8\xff\x7f\x00\x00\xc3" # mov eax, 0x7fff : ret i = [str].pack("P").unpack("l!")[0] cfunc = DL::CFunc.new(i, DL::TYPE_INT) p cfunc.call([]) #=> 32767 文字列としてバイナリを直接生成して、そのポインタをD…

RayCastによる擬似3D描画

わざわざDXRubyでやるような代物ではないのだが。速度的にも、表現力的にも。 RayCastというのは古い技法で、Quakeなどのゲームで初期の頃に使われていた。 壁は2Dマップで表現し、画面を例えば640*480なら横640列と考え、視点の位置から横ピクセル単位に視…

アナログスティック入力

Twitterで@iMAKOPiさんからアナログスティック入力対応パッチを頂いた。スティック2本とPOVをデジタル入力する機能だったので、それをベースにアナログ入力メソッドを追加してみた。 require 'dxruby' font = Font.new(32) Window.loop do x, y, z, rx, ry, …

頂点シェーダでぐるぐる

なんとか画像の3D描画を実現。 ポイントはz座標で、DXRubyで指定する描画優先順位のzは実はそのまま3D空間のz座標として渡されている。ので、x軸y軸回転さえしなければ3D座標としてzを使って遠くにするということは可能だ。座標系として奥がマイナスになると…

インスタンス変数へのアクセス

DXRuby1.3devで追加したSpriteクラスは各種パラメータを設定するのにメソッドを一通り定義してある。Spriteを継承したクラスの中からのアクセスはself.x=のように書く。通常、自分でSpriteクラスを作ったらインスタンス変数に保持するので@x=とすることにな…

少し先のことを考える

頂点シェーダが使えるということで色々試したりしているのだが。とりあえずDXRuby1.4の時点では、3D関連の方向をきちんとサポートすることは無さそうだ。3D描画をするには、現時点で足りない機能がある。 ・頂点バッファ ・Zバッファ ・Vector/Matrix だ。 …

頂点シェーダで画像のX軸回転

昨日のVectorクラスをいじりつつ、昔のコードを引っ張り出してMatrixを部分的に実装。これを使って行列を生成して頂点シェーダに食わせれば、使いやすいかどうかはともかく、とりあえず3D描画が可能なはずだ。 やってみた。

3度目のVectorとMatrix

かつてDXRuby1.1devとDXRubyFwで作ってはみたが未だ本体に含まれないVectorとMatrix。なぜかというと、どうにも微妙感が拭いきれないから。 2D用だったり3D用だったりしつつ、数学的な通常の計算に加えてアフィン変換を簡単にできるように工夫はした。が、な…

頂点シェーダを使う

DXRuby1.3devではシェーダをサポートしていて、主にピクセルシェーダを扱うサンプルを作っているが、仕組み的には頂点シェーダを使うこともできる。ただ、DXRubyが2D専用として開発されている都合上、ちょっと使いにくい。頂点シェーダは最低限、頂点の座標…

DXRuby1.3.6devリリース

Sprite衝突判定の全実装、管理サポートメソッド追加、Shader周りの使い勝手向上、SEGVするような不具合修正など。1.4に必要な機能としてリストアップしてあるほぼすべての実装ができた。あとちょっと残っているものはあるけど。 http://dxruby.sourceforge.j…

複数の衝突判定

Spriteオブジェクトは衝突判定範囲を持ち、そこに画像用のパラメータのスケーリング・ローテーションを反映させて衝突判定を行う。ただ、形状は点、矩形、円、三角に限定されていた。これらを組み合わせて複雑な判定を行いたいという場合がある。 そのような…

ゴボウ製

サンプルに使う画像を作ろうと思って、五芒星を描画してみようとしたらえらい苦労した。 線画なら簡単なのだが、パスを作って中を塗るとかそういった機能は無いので、座標を計算して三角形で描かなければならない。 どうにかできたのでメモ。 require 'dxrub…

Spriteの判定が一通りできた

時間かかったけどなんとか全部できた。 細かいところでは点の判定がちょっと微妙な感じになっていて、幾何学的に点として扱うのか、画面上は1ピクセルの矩形なので矩形として扱うのかといったあたりを整理しておく必要がある。適当に作ったので多分いまは混…

Sprite内の定数

このような定義を考えてみた。(追記:これではダメだ) class Sprite Point = Array Box = Array Circle = Array Triangle = Array end これは衝突判定範囲を指定する際に、配列だとちょっとわかりにくいかなーと思ってその対策案のひとつ。 結局全部Arrayな…

地球儀にしてみた

かんたんネットさま(http://kantan-net.main.jp/worldmap/)から世界地図を頂いて、このまえの球体に貼り付けてみた。アルゴリズムは地図の方式にあわせて変更。ついでに地球なので傾けてみた。画像のサイズが違うとおかしくなる問題もあったのでそのへんも修…

球体レンダリング

ずいぶんまえにTwitterで@terushowさんが3D機能の使い道について説明していたことがあって、そのひとつに例えば球体にテクスチャマッピングをして2D画像を生成する、というのがあったと記憶している。 3Dとはポリゴンのことで、球体をポリゴンで作るとすると…

影をつけてみた

昨日のやつにすごく適当にライティング計算を追加してみた。適当すぎるので正しいかどうかはわからないがなんとなくそれっぽく見えてはいるようだ。 require 'dxruby' hlsl = <<EOS float g_start; float g_level; texture tex0; sampler Samp = sampler_state { Texture =<tex0>; AddressU = BORDER; AddressV = BORDER; }; float4 PS(float2 input : TEXCOOR</eos>…