7

から派生したカスタム ビューを使用して迷路を描画する単純な Android アプリケーションを作成しましたSurfaceViewLunarLander サンプル アプリケーションのモデルに従い、バックグラウンド スレッドを使用してすべての計算と描画をSurfaceHolderオブジェクトに直接実行します。

すべて順調で、小規模/中規模の迷路ではうまく動作していますが、迷路のセル サイズを 8 ピクセルに設定すると、アプリケーションがクロールする迷路内に多数のセルが存在します。

コードは、変更されていない場合でもすべてのセルを描画するという点で、私が気に入らないことを行っています。これは、SurfaceViewダブルバッファーからの画面のちらつきを避けるために必要です (アプリケーションの以前の反復では、変更されたものだけを描画していました。びくびくした混乱をもたらしました)。

そのとき私が望むのは、使用する機能ですが、SurfaceView描画されるものをより選択的にする機能です。これは可能ですか?そうでない場合、代替手段は何ですか?オフスクリーン ビットマップを保持し、最初にそこに選択的に描画するのはどうですか?

編集: オフスクリーンBitmapCanvas組み合わせを実装し、タイマー駆動のステート マシンによって書き込まれ、カービング/ソリューション中に影響を受ける領域のみを描画しました。次に、画面外のビットマップ全体をメソッドSurfaceView内に描画するだけでrun()、問題は解決しました。セル サイズを 5 ピクセルに下げることができ、パフォーマンスは問題ありません。

4

1 に答える 1

5

ダブルバッファリングの問題について:

このチュートリアルシリーズをご覧ください。絵を描く方法に違いはありますか? https://web.archive.org/web/20121109162356/http://www.droidnova.com/playing-with-graphics-in-android-part-iii,176.html

図面の最適化について:

次のリンクは、いくつかのアプローチを説明しています。

http://developer.android.com/guide/topics/graphics/opengl.html

http://developer.android.com/reference/android/opengl/GLSurfaceView.html

連続レンダリングとダーティ時のレンダリング

ゲームやシミュレーションなどのほとんどの3Dアプリケーションは、継続的にアニメーション化されます。ただし、一部の3Dアプリケーションはより反応的です。ユーザーが何かをするまで受動的に待機し、次にそれに反応します。これらのタイプのアプリケーションの場合、画面を継続的に再描画するデフォルトのGLSurfaceViewの動作は時間の無駄です。リアクティブアプリケーションを開発している場合は、GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY)を呼び出すことができます。これにより、連続アニメーションがオフになります。次に、再レンダリングするたびにGLSurfaceView.requestRender()を呼び出します。

また、2Dゲームでは、ユーザーが見ているものを計算するのは特に簡単なので、表示されているシーンからオブジェクトを描画することは控えてください。

最後の注意:

あなたが言った

すべて順調で、中小規模の迷路でも問題なく動作しますが、迷路のセルサイズを8ピクセルに設定すると、アプリケーションが這う迷路にたくさんのセルがあります。

これは、迷路のソリューションを計算していることを意味しますか?もしそうなら、あなたはそれを描くのと同じスレッドでそれをするべきではありません。別のスレッドで解決する必要があります。(私はあなたが間違っていることを理解したかもしれません)

于 2011-02-14T17:05:58.417 に答える