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 プログラミングガイド Open GL ES 2.0 プログラミングガイド
Aaftab Munshi Dan Ginsburg Dave Shreiner アフタブ・ムンシ ダン・ギンズバーグ デーブ・シュライナー 松田 晃一

ピアソン桐原 2009-11-01
売り上げランキング : 32973

Amazonで詳しく見る by G-Tools

ニャッキ格闘列伝 > プログラム >

前の記事:
次の記事:

関連記事

コメントリスト

コメントなし

コメント



*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

こんなタグが使えるみたいよ:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>