Ruby

Closure

http://d.hatena.ne.jp/kilrey/20070705 の続き。 Rubyの標準の関数オブジェクトであるProcはMarshalやYAMLによる永続化が出来ない。 原因は評価環境であるBindingが永続化出来ないため、それを参照するProcも永続化出来ないということらしい。 よく考えたら…

文法2

前回の方法でinclude先のクラスで定義されたメソッドを上書きする方法が判った。 あるクラスの親クラスで既に定義されているメソッドを上書きするには普通にモジュールをincludeするだけで良い。 さて、上書きされるメソッドをこの二つの事例ともに同じ名前…

文法

module Mod def test return "Mod" end end class Cls def test return "Cls" end include(Cls) end p Cls.new()test() 上のスクリプトを実行すると何が表示されるか。答えは"Cls"。 実はモジュールをincludeすると既存のメソッド定義を上書きするのだと勘違…

思い付いたこと

種族レベルというのはどうだろう。クラスレベルとは別に上げることが出来るものとして。 例えば、人間Lv6/戦士Lv10は総Lv16だし、ドラゴンLv32/魔術師Lv17は総Lv49。 利点は*bandで顕著な種族間による能力差をレベル差として吸収出来ることか。 人間Lv1(戦闘…

忙しくなったので

本業が忙しくなった上に私生活も忙しくなったので開発ペースを遅くします。というか、しばらく中断します。生活が落ち着いたら復帰する予定ですが、春ごろまでかかりそうです。

今更だが

roguelikeを作ろうというのは、システムを作るのに興味があるのであって、データを作るのにはあまり興味がないのだよな。 既に動き回ったりは出来ているけど、データはさっぱり作っていない。 まるっきりD&Dにしてしまうか?

ルールを考える。

この休みにはD&Dのルールを読んだ。普通のゲームでは想定外な部分までルール化されているのが面白い。例外事項が多いのは追加ルールが多いからなのだろうか。まあ、とにかくルールを考えよう。 D&DではSavingThrowが興味深かった。反応、頑健、意志の三種類…

dRuby

操作系をdRuby越しにするよう変更したら、操作や画面表示などのイベントがはっきりした。 メッセージが散らばりにくくなったような気もする。 嬉しい副作用だ。

ネットワーク

dRuby越しに操作できるようになった。 dRubyを使ってマッチングサーバーを立てた。 クライアントがマッチングサーバーに接続しに行く。 そのクライアントと対話する用のサーバーを起動する。 クライアントにサーバーのURIを渡す。 クライアントがサーバーに…

整理

またごちゃごちゃしてきた。整理しないと。

curses

charとattrを別々に拾っていたのを一度に拾う。 を実行してみた。描画全体で見て30%くらい速くなった。やっぱり劇的には変わらない。

curses

今のところ、Rubyshでは描画関連が最も重い。ここを高速化しようと思う。 案としては 前に描いたのを憶えておいて、変わったときのみ描き直す。 一つずつaddchしていたのをまとめてaddstrに変更する。 charとattrを別々に拾っていたのを一度に拾う。 という…

最近

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

高速化

ちょっといじったら大きく速度が向上した。いや、ミスによって遅くなっていたのが本来の速度に戻ったというべきか。 視界計算のブレゼンハムをキャッシュした あるキャッシュが有効になっていなかったのを有効にした ある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のライブラリを呼…

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の基本的な制御構造が律速になるメソ…

詰まった。

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

C

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

拡張ライブラリ

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

RubyInline

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