2010-11-26 5 views
4

私はゲームの各フレームを長方形の線で描いています。これは古い学校のハンドヘルド電子ゲームのレクリエーションです。主なゲームのための粗いドットマトリックスとテキストやいくつかの画像のカスタム画像を表示したもの。多くのプリミティブを使用してAndroid Canvasでゲームを描く方法

仮想ドットマトリックス画面に20x20の大きな「ピクセル」があります。また、画面上に7セグメントのディスプレイやその他のものを描画します。

TraceViewによると、多すぎるものがあるので、ほとんどの時間はdrawLineとdrawRectangleメソッドで費やされます。私はドットマトリックスディスプレイの各ピクセルを描画し、の各セグメントに7セグメント表示の各セグメントを描画します。フレームごとに描画します。

最適化が私の頭に浮かびました。変更されたピクセル/セグメントのみを再描画するので、以前のピクセル/セグメントの状態を保存し、変更されたピクセル/セグメントを再描画しようとしました。基本的にそれは原油の無効化です。

私が期待していた動作は、最後のフレームがペイントされた後にキャンバスがそのまま残っていて、必要なものだけを再描画することでした。

私のキャンバスは黒くちらつき、画面の状態が変わったときに、ドットマトリックスの表示/セグメントのピクセルだけがフレームに点滅していました。私はキャンバスをクリアしていないことを確認しました。

私はLunar Lander Androidサンプルで説明されているように、SurfaceView内のCanvasで描画しています。スレッドを更新しています。 Lunar Landerサンプルでは、​​各フレームのすべてを再ペイントします。

多分、最初のフレームですべてをビットマップにレンダリングし、その後、そのフレームごとにビットマップを更新できますか?

paint()メソッドにはどのテクニックを使用しますか?

+0

ドットマトリックスのすべてのピクセルを描画するための駆動要件は何ですか?なぜイメージファイルを作成し、それを画面に描画しないのですか? – user432209

+0

画面上に20x20ピクセルの配列があり、これをオンまたはオフにすることができます。長方形を塗りつぶしたり、スプライトを描画したりする場合は同じです。 – Axarydax

+0

SurfaceHolder.unlockCanvasAndPost()がキャンバスをクリアしているようです。 – Axarydax

答えて

2

SurfaceHolder.unlockCanvasAndPost()はSurface上で実際にページを反転させるので、前のフレームが消去されていなくても、直前に作成したフレームではなく、2番目に古いフレームを取得します。サーフェス上でlock()を実行すると、コンストラクタ内でクリアを行っているたびに新しいキャンバスがインスタンス化されます。

誰かが示唆したようにビットマップに描画したほうがよいですし、イメージをディスプレイに表示するたびにキャンバスにdrawBitmapを描画する方がよいでしょう。

他の誰かが示唆しているように(非常に曖昧に)、ドットマトリックス表示用のスプライトを生成し、プリミティブコマンドで描画するのではなくビットマップのキャッシュから直接描画することができます。 。つまり、ドットマトリックス計算機の場合は、すべての0〜9を10ビットマップに生成し、単純にdrawLine/Rectオペレーションのセットを呼び出すのではなく、キャンバス上で単純にそれらをブリットします。

上記が依然として遅い場合でも、ハードウェアアクセラレーションを利用するOpenGLがあります。

+0

私はすべてのフレームのビットマップに描画しています。これは以前の状態を保持しています。ありがとう! – Axarydax

0

Spritesに行ってみませんか?

+1

詳細を教えてください。スプライトを使用すると何が変わりますか? – Axarydax

+0

スプライトが意味することは、基本的にcris.hが言っているように、小さなビットマップ(スプライトとも呼ばれます)に各可能なイメージ(数字0-9など)を入れ、毎回描画するのではなくビットマップをblitすることです。これは、ビットマップをコピーすることでビットマップをコピーするのではなく、通常、アンチエイリアス処理された一連の線を描画するよりも速いため、マシンの処理方法を「考える」必要がないためです。ビットマップ描画のためにハードウェアアクセラレーションを持つマシンもあります。 – Qwertie

関連する問題