SurfaceViewとViewの違いは?


回答:


210

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

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


2
詳細を含むpierrの回答を確認してください。
Helin Wang


もはやこれほど単純ではありません。pierrの答えを確認してください。詳細なアーキテクチャドキュメント(source.android.com/devices/graphics/architecture.html)へのリンクがあり、Canvasレンダリングのハードウェアアクセラレーションがカスタムビューをより良い選択にする理由を説明しています。
2014

1
SurfaceViewの代わりにFrameLayoutを使用してビューをスタックするのはいつですか?
IgorGanapolsky

103

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

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

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


36
FYI ... A SurfaceViewは今透明にすることができる。stackoverflow.com/questions/5391089/...
スティーブ・

@ラルフレオン:サーフェスビューを透明にできないとはどういう意味ですか?他のビューをサーフェスビューに重ねることはできますか?たとえば、ListViewを一時的にSurfaceビューに表示できますか?
アシュウィン2013

78

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と同期しているため、それが利点かどうかはほとんどわかりません。

2
あなたの答えから、SurfaceViewよりもViewから派生したクラスを使用する方が良いと感じています。それとも私は何か間違っているのですか?これは、2Dゲーム開発のチュートリアルの大部分とは対照的です。
暴風

2
@Stormで考慮すべきことは、SurfaceViewの設計によりUIスレッドがブロックされてはならず、ビューはUIスレッドによってのみ変更できるということです。ほとんどのゲームでは、SurfaceViewsはレンダリングを適切に実行し、シンプルなビューでUIスレッドをブロックします。これは、私の理解から、SurfaceViewの主な利点です。
zgc7009 2015

レンダースレッドを作成するとはどういう意味ですか。毎回手動で作成する必要がありますか?
IgorGanapolsky

44

主な違いは、SurfaceView背景theadsで描画できますが、描画Viewsできないことです。 SurfaceViewsただし、より多くのリソースを使用するので、必要な場合以外は使用しないでください。


「しかし、彼らはより多くのリソースを使用するので、必要がない限りそれらを使用したくないでしょう。」-誰がより多くのリソースを使用しますか?ビューまたはSurfaceViews?
Dror 2013

6
Surfaceviewはビューよりも多くのリソースを使用します
Ritesh

1
@RiteshGuneいくら?
Alex Sifuentes

いつする必要がありますか?
IgorGanapolsky

12

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ため、よりコストがかかります


ハードウェアを高速化することがなぜ重要なのですか?
IgorGanapolsky

8

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

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

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

クラシックビュークラスではなく、SurfaceViewを使用する理由...

主な理由の1つは、SurfaceViewが画面をすばやくレンダリングできることです。

簡単に言うと、SVはタイミングの管理とアニメーションのレンダリングがより可能です。

SurfaceViewについて理解を深めるには、それをViewクラスと比較する必要があります。

違いは何ですか...ビデオでこの簡単な説明を確認してください

https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30

ビューには、1つの大きな問題があります。アニメーションのレンダリングのタイミングです。

通常、onDraw()はAndroidランタイムシステムから呼び出されます。

したがって、AndroidランタイムシステムがonDraw()を呼び出すと、アプリケーションは制御できません。

表示のタイミング。これはアニメーションにとって重要です。タイミングのずれがあります

アプリケーション(ゲーム)とAndroidランタイムシステムの間。

専用スレッドによってonDraw()を呼び出すことができるSV。

したがって、アプリケーションがタイミングを制御します。したがって、アニメーションの次のビットマップイメージを表示できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.