2011.11.25
【Android NDK】マルチフレームレートへの対応
思った以上に簡単にできました。
問題点
60fpsで10フレーム(10/60秒)で右へ200ドットずらすとした場合
フレームカウントの変数を用意して毎フレームインクリメントするように作成する。
ソース的にはこんな感じ
/** カウンタ(フレーム数) */ int g_nCount; /** 表示位置 */ int g_nPos; //移動とインクリメント g_nPos += g_nCount * (200 / 10); g_nCount++; //終了確認 if( g_nCount >= 10 ) { //終了 }
しかしこの方法だとフレーム数が変わるとおかしくなる。
GalaxyS2だと60fpsで動いているが、IS03だと30fpsしかでない。
この部分を共通化できないだろうか。
解決策
フレームカウントではなく経過時間(ms)に変えるとそのまま動いてしまう
上記のソースを改変するとこんな感じ。
/** カウンタ(ms) */ int g_nCount; /** このフレームにかかったms */ int g_nFrameMS; /** 表示位置 */ int g_nPos; /** 現在位置 */ int g_nNowPos; //移動とインクリメント g_nNowPos = g_nPos + (g_nCount * (200 / 100)); g_nCount += g_nFrameMS; //終了確認 if( g_nCount >= 100 ) { //最終位置に場所を変更 g_nNowPos = g_nPos + (g_nCount * (200 / 100)); //終了 }
コツとしては 始点+時間に対する移動量 という形にすることでしょうか。
移動の計算がちょっと重いかもしれないけど
これだけの修正で動くのであればすばらしいよね。
この方式だとフレームレートが関係なくなるので少し処理落ちしても
更新タイミングが少なくなるだけなので機種差も発生しにくくなる。
当たり判定とか長時間かかった時の処理を入れ始めるとすごく大変かもしれないけど。
簡易にやるならこれで十分なわけなのでこういう方法も慣れておくといいかもしれない。
Open GL ES 2.0 プログラミングガイド Aaftab Munshi Dan Ginsburg Dave Shreiner アフタブ・ムンシ ダン・ギンズバーグ デーブ・シュライナー 松田 晃一 ピアソン桐原 2009-11-01 |
関連記事