« 吉里吉里Z リポジトリの移動 | メイン | Opus プラグイン »

2013年12月17日

吉里吉里Z 開発:: フレーム単位でのマルチスレッド化

    

以下のような書き込みを見かけて少し考えてみた。
単なる思考実験。

吉里吉里2では、描画メソッド単位でマルチスレッド化しているから、あんまり速度出ない。
そうじゃなくて、フレーム単位でマルチスレッド化すれば速度が出るはず。

見た時、そんな無茶なと思ったものの、どうすれば実現可能か考えてみた。
思い付く方法は 1つ。
Layer 構造の描画に必要な情報のスナップショットを取り、それを元に別スレッドで描画すれば良い。
Bitmap は Copy-On-Write 管理されているので、コピーも少なくて済むはず。
アニメーションやトランジションなど、スタートとゴールがわかっているのなら、その期間を適当な間隔で区切ってスナップショット作って、別スレッドでレンダリングさせていけば、フレーム単位でマルチスレッド化出来る。
ただ、その場合通常は負荷がかかった時ドロップフレームが発生する形になるのに対し、この方法では動きがゆっくりになると言う違いが出る。
スナップショットをクラスとして、好きにレンダリング要求を出して、レンダリング後の Bitmap を取り出せると汎用的に扱える。

意外となんとかなりそうか? と思ったものの問題に気付く。
ダーティー領域を考慮できなくなるので、小領域の更新の時、非効率的になる。

全体の描画で単純に描画を別スレッド化するだけなら、ダーティー領域の問題はなくなるし、入力の応答性は改善され、少し快適に動作するかもしれない。



投稿者 Takenori : 2013年12月17日 23:23




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