2007-07-01から1ヶ月間の記事一覧

最近

最近のゲーム絡みの雑文はRubyshがあまり進んでいないことの反映だったりする。ネットワークトラブルだとかの対応に追われていたり。 ともかくメモを書く。 攻撃は命中率とダメージ・ダイスと属性。防御は回避率と軽減ダイスと%型の耐性。殴りも魔法も同じ式…

情報

ゲームの局面に関する情報は全員に公開されている情報、一部の人にのみ公開されている情報、完全に非公開の情報がある。麻雀で言えば公開情報が捨て牌やドラと山に残っている牌の数、一部公開情報がそれぞれの手牌、非公開情報が山に残っている牌の中身であ…

経験則大事

同じゲームを何度もプレイしていれば段々上手になる。ことroguelikeにおいては技術の向上は即ち経験則の向上ではないか。 現在の@が潜るべきダンジョン・階層はどの辺りか、現HPが幾つを切ったら即死の危険があるか、物資がどの程度溜ったら蛇を倒せるか、………

初心者が一番最初に学ぶべきプログラミング言語は何か ?

http://d.hatena.ne.jp/lovepotion/?0727071203より。 正直なところ、手続き型を一つと関数型を一つとアセンブラを少し学べば十分ではないかと思う。あとはアルゴリズムやデータ構造を学んだ方が有用かと。あ、最近はデザイン・パターンとUMLも少し必要かも…

リアルタイム

ゲームにはリアルタイムなものとそうでないものがある。 ボードゲームの大半はリアルタイムでない。ボードで刻一刻と状況が変わるようなものを表現するのは難しいからだ。スポーツの大半はリアルタイムだ。身体を使って表現する以上、刻一刻と状況が変わるの…

ゲーム

よく考えれば絶対に勝てるものはゲームではなくパズルである。もちろん、勝てることも負けることもあれば良いというものでもない。全く考えないでも勝率が変わらないものはゲームではなく運試しである。 ゲームのゲームらしさは両者の中間にあるのではないか…

高速化

ちょっといじったら大きく速度が向上した。いや、ミスによって遅くなっていたのが本来の速度に戻ったというべきか。 視界計算のブレゼンハムをキャッシュした あるキャッシュが有効になっていなかったのを有効にした あるC化した関数が有効になっていなかっ…

困った

迷路の生成よりも迷路を保存するオブジェクトを生成する方に時間がかかっている。rubyはnewも遅いのか? 具体的に言えば、迷路の各点を表すソート済み配列があって、それを迷路の大きさ(100*100くらい)生成した。これにかかる時間が30msというところ。 何が問…

迷路生成

迷路生成をC化してみた。驚いたことに約1000倍まで高速化できた。アルゴリズムは先日の通り。

最適化

最適化を進めて行くと行き着くのは「全部Cで書いちゃえ」なのだよね。既にRubyで書いてあるものをCに焼き直すのはあまり難しくないし。むしろ問題はCのライブラリを集めるのが面倒だというくらいなもの(面倒にはライセンスの問題も含む)。

ruby vs gcc

ruby vs gccのベンチマークだとこのようになった。 http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=ruby&lang2=gcc やはり分野別に見ないと詳しいことは判らないね。 正規表現ではrubyとgccはほぼ同じ。まあ、rubyはcのライブラリを呼…

LLVM

LLVM触ってみたよ。gccと大差ない速度だった。コンパイル型言語実装だと考えればそれなりの速さだと言える。スクリプト言語をLLVMに載せるというのは現実的なのだろうか。

LLVM

そう言えば思い出したが、LLVMというのが速いらしい。中間言語を動かすVMなのだが、とにかく速度重視で作ってあるらしい。JITするだけでなく、実行プロファイルから静的に最適化までするらしい。詳しくは手に入れてから書く。

ベンチマーク

そこで良いベンチマークはないかと探してみた。 http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=all 様々な言語で実装した際に速度やメモリ効率、ファイルサイズなどを比較したサイトだ。これによるとCはRubyの50倍程度の速度だという…

A*

A*を全部Cで書き直してみた。今までのC/Ruby混在型に比べて10倍速になった。Rubyのみ型と比べると100倍くらい速い。

gdb

とても古い情報だが、 http://www.rubycolor.org/r/200107b.html#19_t1 で拡張ライブラリのgdbデバッグという手法が紹介されていた。これは使える!と思ったのだが、実際に試してみると違った。 (gdb) b astar_index Function "astar_index" not defined. Ma…

プロファイラ

Cで書いた拡張ライブラリについてはプロファイルが難しい。標準のprofile.rbではRubyレベルのものしか取れない、つまり拡張ライブラリ内部の呼出しは取れない。 かといってC用のプロファイラgprofで取ろうと-pgを付けてコンパイルしても、ダイナミック・リン…

迷路生成

迷路の生成アルゴリズム。 for 部屋番号 in 0...部屋最大値 部屋を作る break if (作る場所がない) if (部屋番号 != 0) then for 試行数 in 0...トンネル最大値 if (新しい部屋から既存の迷路まで穴を掘る) then break if (!トンネルを複数掘るか) end end e…

ちまちまと書いています

迷路生成コードを書いたのだけど滅茶苦茶に遅い。軽く2秒とかかかる。重そうな処理はあまりないのだけど、ループの扱いで時間がかかっているらしい。Rubyメソッドの呼び出しもほとんどないのでC化すれば速くなりそうではある。 - C化した。冗談みたいだが100…

発見

cursesライブラリはungetch()を使うことでGUI操作を自動テストの対象に出来る。getch()だけでなくgetstr()までちゃんと動作する。さっき試してみるまでGUIは自動テストしていなかったよ。 そういえばjavaだとRobotというマウス・キーボード操作をエミュレー…

rb_iterate

拡張ライブラリ内部でブロック付きでRubyの関数を呼びたいときにはrb_iterateすれば良いらしい。iterateするわけでもないのにrb_iterate。歴史的経緯によるものだろうか。

C化

C化する基準が何となく判った気がする。 まず主となるメソッドについてプロファイルを取る。そうするとどこが遅いのかが判る。次にその遅かったメソッドについてプロファイルを取る。これを繰り返して行くと最終的にRubyの基本的な制御構造が律速になるメソ…

ついでに。

pythonの拡張モジュールの書き方を(ある程度)憶えた。簡単なモジュールなら書けると思う。

詰まった。

行き当りばったりで書いていたらぐちゃぐちゃになってしまった。ちゃんと設計しないとダメだな、うん。 - 最初にするべきことを忘れていた。 ベンチマーク。

C

Rubyで聞いたことのある「遅ければCで書け」が理解出来た。確かにRubyの関数をCで書くのは難しくない。特にひとまずRubyで実装してからCに移植するのは簡単だ。ついでに性能差を比較して悦に入ることも出来て気分が良いし。 このような用途ではswigというも…

拡張ライブラリ

拡張ライブラリ内部でRubyの関数を呼ぶ場合にはrb_funcallすれば良いことが判った。それは良いのだが、ブロックを付けて呼び出すにはどうすれば良いのだろう。判らない。 - AstarをCで書いた。ちょっと強引な部分もあるのだが、かなり速くなった。大体、一回…

RubyInline

理由は判らないが、どうもRubyInlineがWindowsで動かない。ただ、拡張ライブラリの書き方を理解したのでRubyInlineの必要はない気もする。

基礎固め

「ソート済Arrayにソートを維持したまま挿入する」が出来た。bsearchというCな拡張ライブラリを拾ったのでそれに追加する形で書いた。ついでにソート済Arrayから効率良く検索するものもCで書いた。 さらにCな拡張ライブラリとしてbresenhamで直線と円を計算…

RubyInline

Rubyのスクリプト中にC言語の関数を書けるようにするらしい。拡張モジュールを手軽に書けるようにしているのだろう。ボトルネックがあればこれを使うと良さそう。 - roguelikeで使う重たい計算というと何があるだろう。AI部分はどうなるか判らないけど、視線…

roguelike

Rubyでroguelikeを作ってみようかな。 タイトルはRubyとRubbishをかけてRubyshにしよう。ついでにRuby Slash & Hackの略だと言う。 RoRと絡められたら面白いのだが難しいかも。ブラウザからMMO roguelikeだとか。 - 必要な部品を考えてみよう。 cursesライブ…