必要な場合、またはSurfaceView
の代わりにView
を使用する方が良いですか?
ビューはすべて、すべてのユーザーインタラクションにも使用される同じGUIスレッドで描画されます。
したがって、GUIを迅速に更新する必要がある場合、またはレンダリングに時間がかかりすぎてユーザーエクスペリエンスに影響する場合は、SurfaceView
を使用してください。
私が指摘したいくつかのこと:
詳細(および優れた使用例)については、SDKのサンプルセクションのLunarLanderプロジェクトを参照してください。
2014年5月9日に更新
OK。 現在は公式文書です これまで述べてきたことすべてを、より良い方法で話しました。
詳細を読む こちら 。
はい、主な違いは、surfaceViewをバックグラウンドスレッドで更新できることです。しかし、あなたが気にするかもしれないより多くがあります。
surfaceViewには専用の表面バッファーがありますが、すべてのビューはViewRootによって割り当てられた1つの表面バッファーを共有します。別の言葉では、surfaceViewはより多くのリソースを必要とします。
surfaceViewはハードウェアアクセラレーション(JB4.2以降)できませんが、通常のViewの95%操作はopenGL ESを使用してハードウェアアクセラレーションされます。
カスタマイズされたsurfaceViewを作成するには、さらに作業を行う必要があります。 surfaceCreated/Destroyイベントのリスナー、レンダースレッドの作成、さらに重要なこととして、レンダースレッドとメインスレッドの同期が必要です。ただし、ビューをカスタマイズするには、onDraw
メソッドをオーバーライドするだけです。
view.invalidate
または他のスレッドでview.postInvalid
を呼び出して、ビューを更新する必要があることをフレームワークに示します。ただし、ビューはすぐには更新されず、次のVSYNCイベントが到着するまで待機します。 VSYNCを理解する簡単な方法は、60fps画面で16msごとに起動するタイマーと考えることです。 Androidでは、すべての通常のビューの更新(および実際に表示しますが、今日は説明しません)は、VSYNCと同期され、よりスムーズになります。これで、surfaceViewに戻って、いつでも好きなようにレンダリングできます。ただし、前述のようにディスプレイもVSYNCと同期しているため、利点であるかどうかはほとんどわかりません。主な違いは、SurfaceView
はバックグラウンドビーズで描画できますが、Views
は描画できないことです。 SurfaceViews
はさらにリソースを使用するので、必要な場合以外は使用しないでください。
SurfaceView
は、Androidのカスタムビューで、その内部に描画するために使用できます。View
とSurfaceView
の主な違いは、ビューがUI Thread
で描画されることです。これは、すべてのユーザーインタラクションに使用されます。
UIを十分に迅速に更新し、その中に大量の情報を表示したい場合は、SurfaceViewの方が適しています。
しかし、SurfaceView
:にはいくつかの技術的な内部があります
1.これらはハードウェアアクセラレーションではありません。
2.メソッドinvalidate
またはpostInvalidate()
を呼び出すと通常のビューがレンダリングされますが、これはビューがすぐに更新されることを意味しません(VSYNC
が送信されます) 、OSが更新を決定しますSurfaceView
はすぐに更新できます。
3. SurfaceViewにはsurface buffer
が割り当てられているため、よりコストがかかります
Surfaceviewとviewの主な違いの1つは、通常のビューの画面を更新するには、ビューが定義されている同じスレッドからinvalidateメソッドを呼び出す必要があることです。ただし、invalidateを呼び出したとしても、リフレッシュはすぐには行われません。 VSYNC信号の次の到着後にのみ発生します。 VSYNC信号は、16.6 msごとに発生するカーネル生成信号です。これは、1秒あたり60フレームとも呼ばれます。したがって、画面の更新をさらに制御したい場合(たとえば、非常に高速で移動するアニメーションの場合)、通常のビュークラスを使用しないでください。
一方、表面ビューの場合は、画面を必要なだけ高速に更新でき、バックグラウンドスレッドから更新できます。したがって、Surfaceviewの更新は実際にはVSYNCに依存しません。これは、高速アニメーションを実行する場合に非常に便利です。これらすべてをうまく説明しているトレーニングビデオとサンプルアプリケーションはほとんどありません。次のトレーニングビデオをご覧ください。