W.Deeの2005年12月の日記

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       ] 月
前月の日記  次月の日記

2005年12月15日

吉里吉里オフ会

第-32760回吉里吉里オフ会を今回も開催致します。詳しくは第八回吉里吉里オフ会inコミケ69 参加者募集のお知らせ こちらをご覧ください。

  • 2005-12-30 03:27 京 秋人 : 来てくださった皆様、お忙しい中ありがとうございました。来年もまたよろしくお願いいたします。DeeさんThx!

2005年12月14日

GDBでwchar_t文字列を表示

そういえば GDB: The GNU Project Debugger って wchar_t 文字列をちゃんと表示してくれないよなーと思ってたのですが、GDB をハックして表示するようにしてしまいました(GDB6.3へのパッチ)。

insightではこんな感じ (ここではwxCharはwchar_tのtypedefです)

insightでwchar_t文字列表示

実際は 2バイト幅の整数へのポインタを UTF-16 として、4バイト幅の整数へのポインタを UTF-32 と無理矢理解釈して表示します。wchar_t が違うエンコーディングだった場合は知りません。

また、natural 形式の表示では整数型だと10進数しか表示されなかったところを、「16進数」「それをUTF16またはUTF32文字として解釈した場合の文字」も表示もするようになっています。

ただ本来は UI 側の文字コードに会わせてエンコーディングを適切に変換して表示してやる必要があるのですが、現在は UTF-8 固定です。insight は内部的に UTF-8 が使われているようなので表示できていますが、Eclipse CDT とかではダメのようです。

あと、MinGW の右側にある Proposed: Insight/gdb からダウンロードできる gdb (6.3 + Insight 6.1) が、なぜか関数にステップ・インするとセグメンテーション違反を起こしていたのも修正。

しばらくの間、自分が使う分には良さそうです。

2005年12月11日

動画再生ライブラリ

動画形式はいろいろあるのですが、それなりにいろいろ問題があります。

  • MPEG I はもうそろそろ時代遅れかなぁ
  • MPEG I でさえたとえばLayer3(MP3のこと)を使ったコンテンツの配布はMP3ライセンスに引っかかるかも
  • MPEG4系 (XviD、DivX、MSMPEG4など) は特許関連が不詳
  • コーデック配布それ自体がライセンスや特許に引っかかる場合がある
  • XviD とかはライセンスが GPL (LGPLではなく) だったりしてちょっと使いにくい(これを組み込んでゲームを出したらしいあそこは大丈夫なんだろうか)
  • OS付属のコーデックはあまり信用ならない

吉里吉里3はマルチプラットフォームを目指す手前、特定のOSに特定のコーデックが入ってることを期待することができないため、自前でコーデックを持たざるを得なくなります。

で、Theoraを標準に でも触れたように、特許の問題がとりあえず無くて、フリーで使いやすいコーデックというと現状やっぱり Theora になるなぁ、と。

ビデオ再生は割とパフォーマンスにシビアな場合が多く、たとえばハードウェアサポートがある場合はハードウェアサポートを利用するなどの最適化に考慮を払うべきだったり、安定して再生するためにバッファリングを内部で行わないとならない状況があったりと、わりと厄介な代物です。

このような状況下で、ゲームなどのアプリケーションへ動画再生機能を組み込みたいときに、安心して使える、使いやすいライブラリがあると便利かな、というわけです。

で、楓 softwareさんの所で開発中の動画再生ライブラリを吉里吉里3では使わせていただこうと考えています (経緯はこちら)。

ちなみに吉里吉里2は前のバージョンではOS(というかDirectShow)にコーデックを選ばせていたので、環境によっては変なサードパーティ製のコーデックが使われたりして再生不具合が生じる、と言ったことが良くありました。しかし、最近のバージョンではたとえサードパーティ製のコーデックが入っていたとしても、OS標準のコーデックを強制的に使うようになったので、コーデックがらみの問題はほとんど聞かなくなりました(こちらも楓 Softwareの井元氏のありがたいご尽力による)。

2005年12月8日

即席たんぽ

寒い!

for(;;);
  • 2005-12-09 01:25 HALO : ササササムイ! while(1);
  • 2005-12-09 03:45 SB : 寒いぃぃぃ! do{ ; }while(1);
  • 2005-12-09 03:55 SB : var str=\"str!\"; str! はオーバーフローしちゃうので使い物にならない…
  • 2005-12-09 13:12 W.Dee : tjsたんぽ(*´д`*) でもCPUを暖めるんだったら、CPUの全回路を駆動してヒートアップさせるような、無限ループではない、もっと別の最適なコードがあるのかもしれない
  • 2005-12-09 15:44 きらら : ビデオ周りの方が熱くなる気がするので、
  • 2005-12-09 15:46 きらら : fpsチェック外してwhile(1){}でビデオフレームをスワップさせると暖かくなれるかも。

2005年12月1日

吉里吉里3のファイルシステム

吉里吉里3 ファイルシステムの設計と実装に入りました。

といってもまだまだ初期段階ですが ... 先は長い。

とりあえず考えていることをば。もちろんこれらは案であって最終的には違う物になっているかもしれません。

前にもここで書いたとおり、POSIX風味のファイル名規則を持ったファイルシステムを導入します。

'/' (ルート) を基底とし、'/' (スラッシュ) を区切りとしたツリー構造で管理します。

ツリーの任意の場所に「ファイルシステム」を「マウント」することができます。マウントを行うと、その場所がそのファイルシステムの中身を参照する形になります。たとえば /data に data.xp4 をマウントすれば、/data/image/imo.tlg は data.xp4 の /image/imo.tlg を参照することになります。

ファイルシステムの種類はとりあえず4つぐらい考えていて、

  • osfs - OS のファイルシステムを参照するファイルシステム
  • tmpfs - メモリ上ののファイルシステム
  • xp4fs - XP4 アーカイブ
  • pathfs - 自動検索用ファイルシステム

となっています (たぶん最終的にはプラグインで拡張可能にします)。

OS のファイルシステムには osfs をマウントすることでアクセスできます。

たぶん、起動直後は '/' (ルート) に tmpfs がマウントされている状態で起動すると思います。起動時にどこにどのファイルシステムをマウントするかはいろいろ考えるべき所ですが ...

tmpfs はすべてがメモリ上に作成されるファイルシステムです。高速なアクセスが可能で書き込みも可能ですが、揮発性(プログラムが終了すると消えてしまう性質) です。でもそれだけだとちょっとつまらないので save や load のようなメソッドを用意して、内容をシリアライズして保存、あるいは読み込みができるようにしたいと思います。なにかのセーブデータが複数のファイルで構成されるような場合、いったん tmpfs を新規にマウントして中にファイルを書いて、それを save メソッドで osfs 上のどこかに保存してアンマウント、のようなことをするとセーブデータが一つにまとまる、といった感じです。

xp4fs は Releaser で作成した XP4 アーカイブを扱うファイルシステムです。

pathfs は、吉里吉里2で言うところの自動検索パスを実現するファイルシステムで、複数箇所のディレクトリの中身を、あたかも一つのディレクトリの中にファイルが全部あるかのように見せることができるファイルシステムです。

マウントの方法は

// OS のカレントディレクトリを '/os' にマウント
Files.mount("/os", new Files.fs.OS("."));
// '/os/data.xp4' (OSのカレントディレクトリ下のdata.xp4)を '/data' にマウント
Files.mount("/data", new Files.fs.XP4("/os/data.xp4"));
// '/data' 以下のファイルをすべて一つのディレクトリにまとめて '/all' から
// アクセスできるようにする
Files.mount("/all", new Files.fs.Path("/data", true));

のように、new で作成したファイルシステムオブジェクトを Files.mount にマウントする形になると思います。ファイルシステムオブジェクトはファイルシステムそれぞれ独自のメソッドやプロパティを持つことができます (たとえば上述の tmpfs の save や load メソッドのようなもの等)。

気が向いたら wxWidgets のファイルシステムをそのまま参照するファイルシステムを作るかもしれません。wxWidgets はそれ自身で独自のファイルシステム (wxFileSystem) を持っているので、それはそれで便利だろうということです。HTTPとかFTPとかzipアーカイブとかをマウントできるようですが、読み込み専用です。

なんか複雑だなーと思われるかもしれませんが、吉里吉里2みたいに OS のファイル名規則と独自のファイル名規則の両方を処理できるように苦心していたり XP3 アーカイブファイルの中身をその仕組みの中で透過的に扱おうとあがいているのに比べれば、実は内部構造的にはすっきりする予定。いったんマウントポイントとそこにマウントするファイルシステムを決めてしまえば、アプリケーション側ではそれが実際にどういうファイルシステム上にあるかを考慮しなくても同じ名前、同じ規則でファイルにアクセスできるので、そっちの面でもすっきり楽になるんじゃないかと思っています。

  • 2005-12-11 10:11 havana : Reiser4やXPathを見ていて思ったのですがファイルにメタデータを持たせ、そのメタデータをパス形式で例えば\"/path/to/file#size\"という風に読み書きできたら、結構便利じゃないだろうかと思いました。
  • 2005-12-12 00:47 W.Dee : 吉里吉里のように「閉じた」環境では、メタデータを特別にファイルシステムから切り離す必要はないと思うので、 /path/to/file.metadata みたいに 「メタデータはメタデータ名を ファイル名のあとにつけたファイル名とする」のような適当なルールを運用レベルで設けてアクセスってのでほとんど代用できませんか? (ちょうど Loop Tuner が hoge.ogg 用のループ情報を hoge.ogg.sli として書き出すように)