« TortoiseSVN でのチェックアウトと更新 | メイン | ブラーをもう少し綺麗に »

2008年03月24日

アニメーションライブラリ:: 簡易版の再生

    

スプライトアニメツールの簡易版が制限付きながらも使えるようになっていたので、それを渡してアニメを作ってもらった。
そのため、そのデータを再生できるようにする必要が生じた。
はじめは、ツールに画像書き出し機能をつけたのでそれでいいかと思っていたけど、容量が結構大きくなってしまうので、アニメを直接再生できるようにすることにした ( 完全に透明な部分はカットして、オフセットと画像のリストを吐くようにしていたが、それでもやはり容量は大きくなってしまった ) 。
それで、ちょっと悩む部分が出てきたので少し整理することにした。

問題は画像の解放タイミング。
画像ファイルはバックグラウンドで非同期読み込みできるようにしつつ、アニメの特定フレーム描画時に描画対象画像が読み込まれていなかったら、読み込んでから描画するようにしている。
バックグラウンドでの読み込みは、任意のタイミングで指定アニメ、もしくは指定アニメの特定フレームで行えるようにする。
各アニメが使う画像は、その画像が初めて使われるフレームと最後に使われるフレームを保持しており、初めて使われるフレーム番号が小さい順にソートして保持している。
指定アニメで読み込み要求があった場合、このリストの順で読み込みを行う。
指定アニメの特定フレームの場合は、単に画像へアクセスするだけのファンクタを作ればよい。
ここまでは特に難しいことはないが、問題は解放。
解放は、指定したアニメが使用している画像を対象とするか、全て解放してしまうかの2種類用意している。
アニメが1つだけであれば、特に気にすることなく解放してしまえばよい。
問題はアニメが2つ以上あって、1つの画像が複数のアニメから参照されている場合。
最初は、単純なリファレンスカウント方式で解放を管理すればいいかと思ったが、よくよく考えればそれではまずい。

バックグラウンドでの読み込みと間に合わなかった時の読み込みが重複するとカウンタが多く進んでしまう。
バックグラウンドでの読み込みに任せてしまうか、間に合わずに読み込んだ時にリストから消すとつじつまは合うが、いくつか難点がある。
バックグラウンドでの読み込みに任せてしまう場合は、先読み指定しなかったときに困る ( いつまでたっても画像が読み込まれない ) と思ったけど、間に合っていなかったらバックグラウンドでの読み込みに依頼して待つと言う方法があるか。ただ、その場合リストに既にあった場合は結局重複してしまうので、あるかどうか調べないといけない。
リストから消すのは、リストをたどるコストがもったいない。
でも、使われる画像の数なんてしれてるか。
数百個も行かないだろうから、リストをたどってもそれほど時間はかからないか。
先読み要求を覚えておいて、もし出ていない状態でアニメの描画要求があったら、まず先読み要求を出すことで、先読み要求が出ていない状態をなくす。
間に合っていない時は、その画像をリストの先頭に持って行って早めに読み込んでもらうようにする。
そして、読み込みが完了するのを待つ。
こうすることで整合性は取れるか。
それに、呼び出し側の作りにもよるが間に合わないことはレアケースだと思う。
基本的には読み込みを意識させないためにバックグラウンドで読み込むので、ギリギリで読み込み依頼出すような作り方はしない ( と言うかそうしたら意味ない ) 。
後、間に合わなかった場合、スレッド間でロックが多く発生して重くなりそうだから、その辺りは良く考えないといけない。

他に考慮すべきことは、読み込み容量の上限と自動解放。
アニメをストリーミング再生する場合にそれらの制御が必要。
自動解放は単純に画像が最後に使われるフレームは持っているから、そのフレームを描画し終わったら解放してしまえばいいだけ。
読み込み容量の上限は、読み込み済みサイズを加算しながら読んで、上限を超える時は一時停止。
解放が呼ばれたタイミングで再開すればいい。

ただ、今回に限って言えば、画像データはそんなにないので、最初に一度全部読んだら最後まで持っていても問題ないし、その方が安全。
とりあえずは同期読み込みで最初に読んでしまうようにしておくか。
今までは全部この形の作りだったし。

しかし、シームレスローディングとはいろいろと厄介だな。
完全にプログラマ依存で、事前に容量計算して、読み込むタイミングと解放タイミングを考慮して作るような形なら、ライブラリ部分は簡単か。
基本的には事前に見積もって作るようにするべきだから、そういう作りでもいいと言えばいい。
まあ、この辺りはもう少し練った方が良さそう。



投稿者 Takenori : 2008年03月24日 18:38




comments powered by Disqus
Total : Today : Yesterday : なかのひと