« 吉里吉里Z リポジトリの移動 | メイン | Opus プラグイン »
2013年12月17日
吉里吉里Z 開発:: フレーム単位でのマルチスレッド化
Tweet @jin1016をフォロー以下のような書き込みを見かけて少し考えてみた。
単なる思考実験。
吉里吉里2では、描画メソッド単位でマルチスレッド化しているから、あんまり速度出ない。
そうじゃなくて、フレーム単位でマルチスレッド化すれば速度が出るはず。
見た時、そんな無茶なと思ったものの、どうすれば実現可能か考えてみた。
思い付く方法は 1つ。
Layer 構造の描画に必要な情報のスナップショットを取り、それを元に別スレッドで描画すれば良い。
Bitmap は Copy-On-Write 管理されているので、コピーも少なくて済むはず。
アニメーションやトランジションなど、スタートとゴールがわかっているのなら、その期間を適当な間隔で区切ってスナップショット作って、別スレッドでレンダリングさせていけば、フレーム単位でマルチスレッド化出来る。
ただ、その場合通常は負荷がかかった時ドロップフレームが発生する形になるのに対し、この方法では動きがゆっくりになると言う違いが出る。
スナップショットをクラスとして、好きにレンダリング要求を出して、レンダリング後の Bitmap を取り出せると汎用的に扱える。
意外となんとかなりそうか? と思ったものの問題に気付く。
ダーティー領域を考慮できなくなるので、小領域の更新の時、非効率的になる。
全体の描画で単純に描画を別スレッド化するだけなら、ダーティー領域の問題はなくなるし、入力の応答性は改善され、少し快適に動作するかもしれない。
投稿者 Takenori : 2013年12月17日 23:23
comments powered by Disqus