回答:
ビューはすべて同じGUIスレッド上に描画され、すべてのユーザーインタラクションにも使用されます。
したがって、GUIをすばやく更新する必要がある場合、またはレンダリングに時間がかかりすぎてユーザーエクスペリエンスに影響する場合は、を使用してくださいSurfaceView
。
私が指摘したいくつかのこと:
詳細(および優れた使用例)については、SDKの例のセクションにあるLunarLanderプロジェクトを参照してください。
2014年5月9日更新
OK。我々は持っている今、公式文書を。それは私が述べたすべてをより良い方法で話しました。
詳細はこちら。
はい、主な違いは、surfaceViewがバックグラウンドスレッドで更新できることです。しかし、あなたが気にする可能性があるより多くがあります。
すべてのビューがViewRootによって割り当てられた1つのサーフェスバッファを共有している間、surfaceViewは専用のサーフェスバッファを持っています。つまり、surfaceViewはより多くのリソースを消費します。
通常のビューでの95%の操作は、openGL ESを使用してハードウェアアクセラレーションされているのに対し、SurfaceViewはハードウェアアクセラレーション(JB4.2以降)できません。
カスタマイズされたsurfaceViewを作成するには、さらに作業が必要です。あなたはsurfaceCreated / Destroyイベントをリスナし、レンダースレッドを作成する必要があります。さらに重要なことは、レンダースレッドとメインスレッドを同期させることです。ただし、ビューをカスタマイズするには、オーバーライドonDraw
メソッドのみが必要です。
view.invalidate
。UIスレッドまたはview.postInvalid
他のスレッドで呼び出して、ビューを更新する必要があることをフレームワークに示します。ただし、ビューはすぐには更新されず、次のVSYNCイベントが到着するまで待機します。VSYNCを理解する簡単な方法は、それが60fps画面で16msごとに起動するタイマーであると考えることです。Androidでは、すべての通常のビューの更新(実際には表示されますが、今日は説明しません)は、VSYNCと同期されてよりスムーズになります。これで、surfaceViewに戻り、いつでも好きなようにレンダリングできます。ただし、前述のようにディスプレイもVSYNCと同期しているため、それが利点かどうかはほとんどわかりません。主な違いは、SurfaceView
背景theadsで描画できますが、描画Views
できないことです。
SurfaceViews
ただし、より多くのリソースを使用するので、必要な場合以外は使用しないでください。
A SurfaceView
は、その内部に描画するために使用できるAndroidのカスタムビューです。
a View
とa の主な違いSurfaceView
は、ビューがで描画されることです
UI Thread
。これは、すべてのユーザー操作に使用されます。
UIをすばやく更新して、そこに大量の情報をレンダリングしたい場合は、SurfaceViewが適しています。
しかし、いくつかの技術的な内部がありSurfaceView
ます:
1. ハードウェアアクセラレーションされていません。
2. あなたがメソッドを呼び出したときに、通常のビューがレンダリングされinvalidate
たりはpostInvalidate()
するが、これはビューが即座に更新されるという意味ではありません(AがVSYNC
送信され、それが更新されたときにOSが決定します。SurfaceView
すぐに更新することができます。
3. A SurfaceViewを持っています割り当てられているsurface buffer
ため、よりコストがかかります
surfaceviewとビューの主な違いの1つは、通常のビューの画面を更新するには、ビューが定義されているのと同じスレッドからinvalidateメソッドを呼び出す必要があることです。しかし、無効化を呼び出しても、更新はすぐには行われません。次のVSYNC信号の到着後にのみ発生します。VSYNC信号は、16.6 msごとに発生するカーネル生成信号です。これは、毎秒60フレームとしても知られています。したがって、画面の更新をより詳細に制御する必要がある場合(たとえば、非常に高速で動くアニメーションの場合)、通常のビュークラスを使用しないでください。
一方、サーフェスビューの場合は、画面を好きなだけ速く更新でき、バックグラウンドスレッドから更新できます。したがって、Surfaceviewの更新は実際にはVSYNCに依存しません。これは、高速アニメーションを実行する場合に非常に役立ちます。これらすべてをうまく説明するトレーニングビデオとサンプルアプリケーションはほとんどありません。以下のトレーニング動画をご覧ください。
クラシックビュークラスではなく、SurfaceViewを使用する理由...
主な理由の1つは、SurfaceViewが画面をすばやくレンダリングできることです。
簡単に言うと、SVはタイミングの管理とアニメーションのレンダリングがより可能です。
SurfaceViewについて理解を深めるには、それをViewクラスと比較する必要があります。
違いは何ですか...ビデオでこの簡単な説明を確認してください
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
ビューには、1つの大きな問題があります。アニメーションのレンダリングのタイミングです。
通常、onDraw()はAndroidランタイムシステムから呼び出されます。
したがって、AndroidランタイムシステムがonDraw()を呼び出すと、アプリケーションは制御できません。
表示のタイミング。これはアニメーションにとって重要です。タイミングのずれがあります
アプリケーション(ゲーム)とAndroidランタイムシステムの間。
専用スレッドによってonDraw()を呼び出すことができるSV。
したがって、アプリケーションがタイミングを制御します。したがって、アニメーションの次のビットマップイメージを表示できます。