6

私はかなりの時間検索しましたが、私の質問に対する簡潔で明確な回答を見つけることができませんでした. 画面にスポーツ フィールド (すべてのピッチ ラインを含む) を描画する必要があるアプリケーションがあります。これまでのところ、SurfaceView を拡張し、残りの LunarLander デモもほとんどコピーしました。ピッチを正しい寸法に描画するためにアプリケーションが必要とするすべてのデータは、正常に機能するソケットから受信されます。ただし、onDraw() 関数の分で、各フレームにすべての線を描画しているため、エミュレータのフレームレートがかなり遅くなります (例: ~10fps)。ここに私の onDraw() 関数があります:

@Override
public void onDraw(Canvas canvas) {
canvas.drawARGB(255,0,144,0);
canvas.drawLine(canvas, getFirstLine(), mPaint);
canvas.drawRect(canvas, getFirstRect(), mPaint);
canvas.drawRect(canvas, getSecondRect(), mPaint);
...
canvas.drawRect(canvas, getSecondRect(), mPaint);
drawAnimatedObjects();
}

次に、この背景の上に円とさまざまな位置を描きます。私の質問は、これをより効率的にするにはどうすればよいですか? アプリケーションの初期化時に線を描画し、フレームごとに線を再描画する必要がない方法はありますか?

助けてくれてありがとう。

4

2 に答える 2

15

初期化時にビットマップに変更されないキャンバス描画を確実にキャッシュし、onDraw() でそのビットマップを描画する必要があります。これにより、レンダリング時間が大幅に短縮されます。何かのようなもの:

Bitmap mField = null;

void init()
{
  mField = new Bitmap(...dimensions...);
  Canvas c = new Canvas(mField);
  c.drawRect(...);
  ...
}

void onDraw(Canvas c)
{
  c.drawBitmap(mField);
}
于 2010-08-04T18:33:38.307 に答える
0

あなたの運動場は静的ですか、それとも画面をスクロールしますか? 静的な場合は、一度ビルドして、毎回再描画される画像として保存することを検討する必要があります。もう1つ、エミュレータは最新のデバイスと比較して非常に遅いです。実際のパフォーマンスを確認するには、少なくとも G1 以降でパフォーマンスを確認する必要があります。

于 2010-08-04T15:42:55.607 に答える