14

低速のデバイス (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 に影響している可能性がありますか?

少なくとも理論には興味があります。

4

4 に答える 4

11

ドキュメントの lockCanvas() について:

Surface の準備ができていないときにこれを繰り返し呼び出すと (Callback.surfaceCreated の前または Callback.surfaceDestroyed の後)、CPU の消費を避けるために、呼び出しは低速に調整されます。

一部のデバイスでは描画ループの開始が早すぎる可能性はありますか? あなたが書いたので、これが問題だと思います:

ここで、SurfaceView のコンストラクターに遅延 (約 10 秒) を追加すると、速度低下が発生せず、すべて正常に動作することがわかりました。

于 2011-03-10T07:55:19.993 に答える
0

描画で同じ不可解な問題に遭遇しましたが、描画を 上の描画にCanvas変更することで解決しました。しかし今、私は常に遅い通話をしています。これが私の観察結果です。問題は一部のデバイスでのみ発生します:CanvasSurfaceViewlockCanvas()

  • Galaxy Note 3 n900: 問題あり
  • Galaxy Note 3 n9005: 問題あり
  • Galaxy S4 i9505: 問題あり
  • Galaxy Gio: 問題なし
  • LG G2 D802: 問題あり
  • Galaxy S2 i9100: 問題なし

View を拡張して onDraw() を実装することで SurfaceView を一時的に置き換えたところ、はるかに優れたフレームレートが得られました

GLES20Canvasまた、Samsung の携帯電話は通常Canvasの描画ではなく、描画を使用すると、パフォーマンスが向上することにも気付きonDraw()ました。

于 2015-12-28T13:29:27.343 に答える
0

それでは、おそらく、holder.isCreating() を使用して状態を確認できますか? canvas がまだ作成中の場合、このメソッドは true を返します。

while(holder.isCreating()) {} can=holder.lockCanvas(); のようなもの

しかし、私は今少し混乱しています。私が知っているように、サーフェスビューが作成されるとコルベックが呼び出されます。SurfaceHolder.Callback インターフェイスを実装する必要があります。そして、サーフェスが作成されると、コールバック メソッド public void surfaceCreated(SurfaceHolder holder) { } が呼び出されます。surfaceCreated メソッドからゲームループ スレッドを開始しています。

于 2011-12-06T07:53:12.433 に答える