2010/09/05 (Sun)
■[プログラミング] ゲーム用のファイルシステム Part 1
順番にファイルを出していこうと思います。まぁ、まだ完成してはいない部分もあるですが、この辺は変わらないだろうと。
今回は、ファイルインターフェースを定義しているヘッダファイルです。
こういう仕様のものを作りますよ〜という感じで。
ちなみに、細かい部分は以下の方針で実装します。
Unicodeのみに対応します。
どこで変換するかの違いだけですので、このライブラリの外側でShift-JISとかへの変換をお願いしますということで。
2GBを超えるファイルには対応しません。
内部でファイルマッピングオブジェクトを使っている以上、32bit環境下ではどうせ2GBを超えるファイルは上手く動かないよね、ということで。
私はどうせそんな大きなファイルは使わないですし。
Doxygenでドキュメント生成ができるようにコメントを書きます。
後でマニュアルとして使えるように。
全部ライブラリ専用の名前空間に入れます。
だってIFileとかCFileとか簡単に名前が衝突するでしょ、ということで。
2010/09/02 (Thu)
■[プログラミング] 同じファイルを2度開く
アーカイブファイルを扱う場合、同じファイルを複数箇所で扱う場面が多々出てきます。
そういう場合に、色々な方法が考えられるけれども、どの方法が最もいいのか悩むところ。
複数回CreateFileする
ファイルパスの管理も行う必要があるけれども、最も単純な手段。
深く考えないならこれで十二分。
ファイルマッピングオブジェクトを使う
ファイルマッピングオブジェクトとかの管理も必要になるけれども、それなりに簡単な手段。
普通のメモリのようにファイルアクセスができるので、色々と実装が楽になるメリットもある。
ただ、大きいファイル(4G超えるファイルとか)を全部マップしようとするとエラーで落ちるので(64bit版Windowsなら問題ないかもしれないけど)、大き過ぎるファイルは扱えないという制限が付くかもしれない。
まぁ、そんな制限にかかるようなものはそうないハズなので、どうでもいいのですけどね。
排他処理する
ファイルからの読み込み前に、クリティカルセクションとかで排他処理して、ファイルポインタの移動して、読み込んで、とかする。
この方法を使うメリットが特に思い付かない、面倒なだけの方法です。
全部メモリに展開してしまえ
それぐらいだったらファイルマッピングオブジェクトを使いましょう。
その他
DuplicateHandleとか使えるのかなと試してみたけれど、ファイルポインタが同一のものになってしまうんですね。
同一オブジェクトを指すハンドルの複製だから仕方がないです、ファイルポインタが違ったら違うオブジェクトですからね。
それで結局どう実装するの
ファイルマッピングすることにしました。
他の実装が楽になりますからね。
2010/08/23 (Mon)
■[活動日誌] 次回予告
自作ゲーム用のファイルシステムでも晒そうかなと思います。
まだ作りかけなのですが。
こんな感じのものを作る予定です。
『普通のファイルとアーカイブファイルを同様に扱える』というのは、デバッグ中とか製作中はデータ変更が頻繁にあるので、その度にアーカイブファイルを作り直すのが面倒だからです。
例えば製作中はデータをDataフォルダに入れ、完成したらアーカイブに固めて、そのアーカイブファイルがあたかもDataフォルダであるかのように振舞う、そんなものを作ってみます。
『freadやftellみたいな関数が使える』と『IStreamインターフェースが使える』のは、色々なライブラリと組み合わせて使い易くするためです。
直接fopenとかfreadとかを使っているものではダメですが、Ogg Vorbis等のように、ファイルアクセスに使用する関数を指定できるようなものは簡単に使えるようにしたいものです。
今回は、ソースコードはファイル単位で出せるようにしたいですね、そのまま使えるように。