低速のデバイス (Orange San Francisco 別名 ZTE Blade) でゲームをテストすると、フレーム レートが非常に高くなりました。
描画ループにデバッグ コードを挿入したところ、次の行が 100 ミリ秒以上かかっていることがわかりました。
c = mSurfaceHolder.lockCanvas();
他の誰かがこの動作を見ましたか? View を拡張して onDraw() を実装することで SurfaceView を一時的に置き換えたところ、はるかに優れたフレームレートが得られました。
一般的には、私の HTC Desire では surfaceView の方がはるかに高速です。これは Android 2.1 の問題であると思われます。電話をルート化して、可能であれば 2.2 にアップグレードすることを考えていますが、2.1 で動作するデバイスが欲しかったので、長期的には逆効果になる可能性があります。
** アップデート **
私はこれにもう少し取り組んでおり、さらに不可解な側面を発見しました。
電話をルート化して 2.2 をインストールしましたが、まだ問題が発生します。アプリが最初に起動されたとき、lockCanvas は期待どおりに動作しています (0 ~ 1 ミリ秒)。その後、初期化中のある時点で、lockCanvas が突然約 100 ミリ秒かかり始めます。
ロード画面を表示できるように、アセットを Async タスクでロードしていることを指摘しておく価値があるかもしれません。
速度低下が発生したときにプログラムが実際に何をしているのかを突き止めようと最善を尽くしたにもかかわらず、そうすることができませんでした。実際、デバッグ モードでシングル ステップで実行すると、高速に動作します。
ここで、SurfaceView のコンストラクターに遅延 (約 10 秒) を追加すると、速度低下が発生せず、すべて正常に動作することがわかりました。
ただし、ホームを押してから元に戻すと、速度が低下します。
私は、このばかげた非論理的な問題について、ほぼ限界に達しています。私はそれをデバイス固有の問題に置くことを心に留めています。
メモリ使用量と関係があると思います。何かがスワップアウトされており、ビデオ RAM に影響している可能性がありますか?
少なくとも理論には興味があります。