SurfaceView和View之间的区别?

时间:2009-08-07 07:31:24

标签: android graphics 2d

何时需要或更好地使用SurfaceView代替View

7 个答案:

答案 0 :(得分:201)

视图全部绘制在同一个GUI线程上,该线程也用于所有用户交互。

因此,如果您需要快速更新GUI或者渲染需要花费太多时间并影响用户体验,请使用SurfaceView

答案 1 :(得分:100)

我注意到的一些事情:

  • SurfaceViews包含一个很好的渲染机制,允许线程更新曲面的内容而不使用处理程序(适用于动画)。
  • Surfaceviews 不能透明,它们只能显示在视图层次结构中的其他元素后面。
  • 我发现动画要比渲染到视图要快得多。

有关更多信息(以及一个很好的用法示例),请参阅SDK中的LunarLander项目 的例子部分。

答案 2 :(得分:74)

已于2014年9月9日更新

行。我们official document now.它以更好的方式谈论了我提到的所有内容。


详细阅读here

是的,主要的区别是surfaceView可以在后台线程上更新。但是,您可能会关注更多。

  • surfaceView具有专用表面缓冲区,而所有视图共享一个由ViewRoot分配的表面缓冲区。换句话说,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同步,如前所述。

答案 3 :(得分:43)

主要区别在于SurfaceView可以由背景theads绘制,但Views不能。 SurfaceViews使用更多资源,因此除非必须,否则不要使用它们。

答案 4 :(得分:12)

SurfaceView是Android中的自定义视图,可用于在其中绘制。

ViewSurfaceView之间的主要区别在于,绘制了一个视图 UI Thread,用于所有用户互动。

如果您想要足够快地更新UI并在其中呈现大量信息 它,SurfaceView是一个更好的选择。

但是SurfaceView还有一些技术内容:

1。它们不是硬件加速的。

  2。调用方法invalidatepostInvalidate()时会呈现正常视图,但这并不意味着视图将是     立即更新(A VSYNC将被发送,操作系统决定何时     它得到更新。 SurfaceView可以立即更新。

  3。 SurfaceView已分配surface buffer,因此成本更高

答案 5 :(得分:7)

surfaceview和view之间的主要区别之一是要刷新普通视图的屏幕,我们必须从定义视图的同一线程调用invalidate方法。但即使我们调用invalidate,刷新也不会立即发生。它仅在下一次到达VSYNC信号后发生。 VSYNC信号是内核生成的信号,每16.6 ms发生一次,或者也称为每秒60帧。因此,如果我们想要更多地控制屏幕的刷新(例如对于非常快速移动的动画),我们就不应该使用普通的视图类。

另一方面,在surfaceview的情况下,我们可以尽快刷新屏幕,我们可以从后台线程中完成。因此,faceview的清新真的不依赖于VSYNC,如果我们想要进行高速动画,这非常有用。我很少有培训视频和示例应用程序可以很好地解释所有这些事情。请查看以下培训视频。

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8

答案 6 :(得分:-1)

为什么使用SurfaceView而不是经典的View类...

主要原因之一是SurfaceView可以快速渲染屏幕。

简单来说,SV可以更好地管理时间安排和渲染动画。

要更好地了解什么是SurfaceView,必须将其与View类进行比较。

有什么区别...检查视频中的这个简单说明

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

使用View,我们有一个主要问题。...渲染动画的时间。

通常,onDraw()是从Android运行时系统调用的。

因此,当Android运行时系统调用onDraw()时,应用程序将无法控制

显示时间,这对于动画很重要。我们有时间差

在应用程序(我们的游戏)和Android运行时系统之间。

SV可以通过专用线程调用onDraw()。

因此:该应用程序控制时间。这样我们就可以显示动画的下一个位图图像。