web-dev-qa-db-ja.com

SurfaceViewとViewの違いは?

必要な場合、またはSurfaceViewの代わりにViewを使用する方が良いですか?

203
Viktor

ビューはすべて、すべてのユーザーインタラクションにも使用される同じGUIスレッドで描画されます。

したがって、GUIを迅速に更新する必要がある場合、またはレンダリングに時間がかかりすぎてユーザーエクスペリエンスに影響する場合は、SurfaceViewを使用してください。

206
Niko Gamulin

私が指摘したいくつかのこと:

  • SurfaceViewには、ハンドラーを使用せずにスレッドがサーフェスのコンテンツを更新できるニースレンダリングメカニズムが含まれています(アニメーションに適しています)。
  • Surfaceviews cannot透明であり、ビュー階層内の他の要素の背後にのみ表示できます。
  • ビューにレンダリングするよりもアニメーションの方がはるかに高速であることがわかりました。

詳細(および優れた使用例)については、SDKのサンプルセクションのLunarLanderプロジェクトを参照してください。

100
Ralphleon

2014年5月9日に更新

OK。 現在は公式文書です これまで述べてきたことすべてを、より良い方法で話しました。


詳細を読む こちら

はい、主な違いは、surfaceViewをバックグラウンドスレッドで更新できることです。しかし、あなたが気にするかもしれないより多くがあります。

  • surfaceViewには専用の表面バッファーがありますが、すべてのビューはViewRootによって割り当てられた1つの表面バッファーを共有します。別の言葉では、surfaceViewはより多くのリソースを必要とします。

  • surfaceViewはハードウェアアクセラレーション(JB4.2以降)できませんが、通常のViewの95%操作はopenGL ESを使用してハードウェアアクセラレーションされます。

  • カスタマイズされたsurfaceViewを作成するには、さらに作業を行う必要があります。 surfaceCreated/Destroyイベントのリスナー、レンダースレッドの作成、さらに重要なこととして、レンダースレッドとメインスレッドの同期が必要です。ただし、ビューをカスタマイズするには、onDrawメソッドをオーバーライドするだけです。

  • 更新のタイミングは異なります。通常のビュー更新メカニズムは、フレームワークによって制約または制御されます。UIスレッドでview.invalidateまたは他のスレッドでview.postInvalidを呼び出して、ビューを更新する必要があることをフレームワークに示します。ただし、ビューはすぐには更新されず、次のVSYNCイベントが到着するまで待機します。 VSYNCを理解する簡単な方法は、60fps画面で16msごとに起動するタイマーと考えることです。 Androidでは、すべての通常のビューの更新(および実際に表示しますが、今日は説明しません)は、VSYNCと同期され、よりスムーズになります。これで、surfaceViewに戻って、いつでも好きなようにレンダリングできます。ただし、前述のようにディスプレイもVSYNCと同期しているため、利点であるかどうかはほとんどわかりません。
76
pierrotlefou

主な違いは、SurfaceViewはバックグラウンドビーズで描画できますが、Viewsは描画できないことです。 SurfaceViewsはさらにリソースを使用するので、必要な場合以外は使用しないでください。

44
jcoder

SurfaceViewは、Androidのカスタムビューで、その内部に描画するために使用できます。

ViewSurfaceViewの主な違いは、ビューがUI Threadで描画されることです。これは、すべてのユーザーインタラクションに使用されます。

UIを十分に迅速に更新し、その中に大量の情報を表示したい場合は、SurfaceViewの方が適しています。

しかし、SurfaceViewにはいくつかの技術的な内部があります

1.これらはハードウェアアクセラレーションではありません。

2.メソッドinvalidateまたはpostInvalidate()を呼び出すと通常のビューがレンダリングされますが、これはビューがすぐに更新されることを意味しません(VSYNCが送信されます) 、OSが更新を決定しますSurfaceViewはすぐに更新できます。

3. SurfaceViewにはsurface bufferが割り当てられているため、よりコストがかかります

12

Surfaceviewとviewの主な違いの1つは、通常のビューの画面を更新するには、ビューが定義されている同じスレッドからinvalidateメソッドを呼び出す必要があることです。ただし、invalidateを呼び出したとしても、リフレッシュはすぐには行われません。 VSYNC信号の次の到着後にのみ発生します。 VSYNC信号は、16.6 msごとに発生するカーネル生成信号です。これは、1秒あたり60フレームとも呼ばれます。したがって、画面の更新をさらに制御したい場合(たとえば、非常に高速で移動するアニメーションの場合)、通常のビュークラスを使用しないでください。

一方、表面ビューの場合は、画面を必要なだけ高速に更新でき、バックグラウンドスレッドから更新できます。したがって、Surfaceviewの更新は実際にはVSYNCに依存しません。これは、高速アニメーションを実行する場合に非常に便利です。これらすべてをうまく説明しているトレーニングビデオとサンプルアプリケーションはほとんどありません。次のトレーニングビデオをご覧ください。

https://youtu.be/kRqsoApOr9

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8