SurfaceView和View之间的区别?


Answers:


210

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

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


2
检查包含更多详细信息的皮埃尔的答案。
Helin Wang


它不再是那么简单。检查皮埃尔的答案;它具有指向详细架构文档的链接(source.android.com/devices/graphics/architecture.html),并说明了为什么Canvas渲染的硬件加速可以使自定义视图成为更好的选择。
fadden 2014年

1
什么时候使用FrameLayout而不是SurfaceView堆叠视图?
IgorGanapolsky

103

我注意到的几件事:

  • SurfaceViews包含一个不错的渲染机制,该机制允许线程在不使用处理程序的情况下更新表面的内容(适用于动画)。
  • Surfaceview 不能透明,只能出现在视图层次结构中的其他元素后面。
  • 我发现它们在动画上比在View上渲染要快得多。

有关更多信息(以及出色的用法示例),请参阅SDK的示例部分中的LunarLander项目。


36
仅供参考... SurfaceView现在可以是透明的:stackoverflow.com/questions/5391089/…–
Steve

@Ralphleon:“表面视图”不能透明是什么意思?其他视图可以与“曲面”视图重叠吗?例如,我可以暂时在Surface视图上显示ListView吗?
Ashwin

78

更新05/09/2014

好。我们现在正式文件。它以一种更好的方式讲述了我刚才提到的所有内容。


在这里阅读更多详细信息

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

  • surfaceView具有专用的表面缓冲区,而所有视图共享一个由ViewRoot分配的表面缓冲区。换句话说,surfaceView花费更多资源。

  • 表面视图不能被硬件加速(从JB4.2开始),而普通视图上的95%操作是使用openGL ES进行硬件加速的。

  • 应该做更多的工作来创建自定义的surfaceView。您需要侦听surfaceCreated / Destroy事件,创建渲染线程,更重要的是,同步渲染线程和主线程。但是,要自定义视图,您需要做的就是重写onDraw方法。

  • 更新的时间不同。普通视图更新机制受框架约束或控制:您可以view.invalidate在UI线程或view.postInvalid其他线程中调用以向框架指示应更新视图。但是,视图不会立即更新,而是要等到下一个VSYNC事件到来。理解VSYNC的简单方法是将其视为一个计时器,它每隔16毫秒触发一次60fps的屏幕。在Android中,所有常规视图更新(实际上会显示,但今天我不会说)都与VSYNC同步,以实现更好的平滑度。现在,回到surfaceView,您可以随时根据需要进行渲染。但是,如前所述,由于显示也与VSYNC同步,因此我很难说出它是否有优势。

2
从您的回答中,我感觉到,使用从View派生的类比使用SurfaceView更好。还是我出了点问题?这将与大多数2D游戏开发教程相反。
暴风雨

2
@Storm要考虑的一点是,SurfaceView设计不应阻塞UI线程,而只能由UI线程修改视图。在大多数游戏中,SurfaceViews会进行大量渲染,这将以简单的视图阻塞UI线程。根据我的理解,这是SurfaceView的主要好处。
zgc7009 2015年

创建渲染线程是什么意思。我们每次都必须手动创建吗?
IgorGanapolsky

44

主要区别在于SurfaceView可以通过背景广告进行绘制,但Views不能。 SurfaceViews尽管要使用更多的资源,所以除非有必要,否则您不想使用它们。


“尽管它们使用了更多资源,但除非有必要,否则您不希望使用它们。” -谁在使用更多资源?视图还是SurfaceViews?
Dror

6
Surfaceview使用的资源多于视图
Ritesh Gune

1
@RiteshGune多少钱?
Alex Sifuentes '16

我们什么时候必须
IgorGanapolsky

12

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

a View和a 之间的主要区别SurfaceView是在中绘制了一个View,该视图 UI Thread用于所有用户交互。

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

但是,有一些技术方面的知识SurfaceView

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

2. 当调用方法invalidate或时postInvalidate(),将呈现普通视图,但这并不意味着视图将立即更新(VSYNC将发送一个视图,操作系统将决定何时更新该视图。SurfaceView可以立即更新。)

3 . SurfaceView具有分配的surface buffer,因此成本更高


为什么硬件加速很重要?
IgorGanapolsky

8

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

另一方面,在使用Surfaceview的情况下,我们可以根据需要尽快刷新屏幕,并且可以从后台线程进行刷新。因此,刷新表面视图确实不依赖于VSYNC,如果我们要进行高速动画制作,这非常有用。我几乎没有培训视频和示例应用程序,它们很好地解释了所有这些内容。请观看以下培训视频。

https://youtu.be/kRqsoApOr9U

https://youtu.be/Ji84HJ85FIQ

https://youtu.be/U8igPoyrUf8


0

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

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

用简单的话来说,SV更有能力管理时序和渲染动画。

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

有什么区别...请在视频中查看以下简单说明

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

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

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.