W.Deeの2003年11月の日記

kikyou.info»日記
最新月 : 2008年10月
2003年 [             3    4    5    6    7    8    9   10   11   12  ] 月
2004年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2005年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2006年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2007年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2008年 [   1    2    3    4    5    6    7    8    9   10   11   12  ] 月
2009年 [   1    2    3    4    5    6    7    8    9   10   11       ] 月
前月の日記  次月の日記

2003年11月30日

グラフィックアクセラレータ

吉里吉里も素直にDirectDrawとかDirect3D使えば相当コーディング楽になったんじゃないかと、いまさらながら思ったりします。逆にサポートが大変になるんだろうとも思います。以下、実はDirectXはDirectX2の知識でとまっているW.Deeの言い訳です。

PCMサウンド周りはDirectSound使ってますが、まあ確かに自前でミキシングするとかよりは楽。

ただDirectSoundも結構、環境依存性多くて。現状の吉里吉里も特に環境依存の問題がおきるのってたいていDirectXがらみですね。

吉里吉里は基本的にすべての環境で安定して動くのとすべての環境で同じように動くように、あまりOSの機能を利用したりハードウェアの機能を利用したりしてません。

よりよい環境(ハードウェアアクセラレーションの効く環境)では、ハードウェアの助けを借りてより滑らかに動くのは魅力ではあるんですけど、そういう環境ってCPUもそこそこ強力ですしね。ゴリゴリCPUで演算やってもそれなりには動くと。むしろCPUでゴリゴリするのが好き。Direct3Dでスクリーン乗算とか多い焼きとかできるんかな。とりあえずはこのままで行きます。

11月

あうー11月も終わりですか。

「次回イベントでは他薦、自薦問わず、登録可能な形の CGI を用意し、早期に呼びかけを行いたいと思います。」とか2003年8月18日の日記で言っていましたが、忙しくてできそうにありません。すみません。2.20リリースも下手すると年末ぎりぎりです。

2003年11月15日

吉里吉里2.20を出した後にやりたいこと

やりたいこといっぱいです。短期的に、ですが、「やりたいこと」を書き連ねてみました。最近忙しいのでどんなスケジュールになるのか見通しがつきませんが。

長期的にはネットワーク対応(認証関連含む)があります。

tTVPComplexRect の高速化

2003年11月7日の日記にも書きましたが、吉里吉里の画面更新において結構大きな役目を果たしているので、これが高速化されればもうちょっと派手な演出も低い負荷でできるようになるかも。

レイヤに対するブラー(ぼかし)

ゆんさんからボックス・ブラーのナイスなコードをいただいているので、ありがたく組み込ませて頂きたいです。αを考慮した処理ではかなり重めの処理になります。

もっと速い補間拡縮

補間拡縮は条件付きで現状でもできるのですが、ほとんど最適化を考えていないためとんでもなく遅いので何とかしたいです。リアルタイム処理で使えるぐらいにはしたい・・・。

KAG3に else タグ追加

if〜else〜endif ができるようになります。

TJS2 で可変個数の引数を処理できるように

引数リストで * (asterisk) を使って引数を配列に変換する指定をできるようにします。

function hoge(args*)
{
  // args は引数が配列になった物
}

引数の途中以降を配列で受け取れます。

function hoge(a, b, args*)
{
  // a, b は最初の2つの引数、それ以降は args に配列で
}

他の関数に引き渡すときも * を使います。 * は配列を関数の引数に展開します。

function hoge(a, b, args*)
{
  // a, b は最初の2つの引数、それ以降は args に配列で
  func(0, args*); // args 配列を引数に展開
}

名前なしの可変個数の引数配列を指定できます。名前なしは内部処理の都合上、高速に処理できます。

function hoge(a, b, *)
{
  // a, b は最初の2つの引数、それ以降は名前無し引数配列
  func(0, *); // 名前無し引数配列を渡す
}

既存の文法に 引数リストとして ... を渡すというのがありましたが、以下の二つの関数は等価です。

function hoge(*) { func(*); }
function hoge() { func(...); }
TJS2 でクラスメソッドの削除や置き換えが可能なように
class hoge
{
  function hoge() {}
  function finalize() {}
  function test() { Debug.messae("a"); }
}

var obj = new hoge();
obj.test(); // a と表示される

hoge.test = function() { Debug.message("b"); } // クラスメソッドの置き換え
obj.test(); // b と表示され・・・ない(a と表示される)

obj = new hoge(); // オブジェクトを作り直す
obj.test(); // b と表示される

delete hoge.test; // hoge クラスの test メソッドを削除
obj.test(); // エラーにならない (b と表示される)

obj = new hoge(); // オブジェクトを作り直す
obj.test(); // obj.test が無いとしてエラーになる

クラスメソッドを置き換えられるようになります。ただしそれが反映されるのは、それ以降に作成したオブジェクトに対してのみです。既存のオブジェクトには反映されません。

2003年11月7日

吉里吉里のリージョン管理

吉里吉里内に tTVPComplexRect というクラスがあります。いわゆる「リージョン」(領域)を、複数の矩形の集合で管理する物です。各矩形は互いに重なることはありません。何に使われているかというと、画面の更新領域の管理に使われています。

で、これ、現状ではかなりいい加減な実装で、たとえば リージョンに一個矩形を OR 演算するだけでも、既存の矩形数に比例した時間がかかります。

改善しようと思い、いろいろほかの実装を見たんですが (Gtk+、QT、CrystalSpace, Mozillaなど)、とりあえず現状で知る限り、Mozillaのソースのmozilla/gfx/src/nsRegion.cpp が見た感じ、最適化という意味ではもっとも進んでいそうな。矩形をリンクリストで持って、矩形の各左上の頂点の位置でソートされた状態で管理しているようです。

矩形をソートされた状態で持っているため、ある特定の矩形と交差する矩形を検索するなどというのも それなりに速いようです。

ソート済みリンクリストに矩形を一つ挿入するときに、どの位置に挿入するべきかをリンクをたどって探しています。効率悪そうだな、と思ったら工夫がされていて、(リージョン内の)一番最後にいじった矩形の近辺から検索しています。矩形を分割したりするときに矩形が増えますが、それはしばしばその矩形の近辺で発生するので、そこから探せばいいという発想のようです。

もうちょっと考えたり調べたりしてみます。