SurfaceView和View的区别?
什么时候需要使用SurfaceView
而不是View
?
所有视图都在同一个GUI线程上绘制,也用于所有用户交互。
因此,如果您需要快速更新GUI,或者如果渲染花费太多时间并影响用户体验,请使用SurfaceView
。
我注意到了一些事情:
- SurfaceViews包含一个很好的渲染机制,允许线程更新表面的内容,而无需使用处理程序(适用于animation)。
- 曲面视图不能透明,只能出现在视图层次结构中的其他元素的后面。
- 我发现它们比渲染到View更快。
有关更多信息(以及一个很好的使用示例),请参阅SDK示例部分中的LunarLander项目。
已更新05/09/2014
好。 我们现在有官方文件。 它以更好的方式谈到我所提到的所有事情。
在这里阅读更多细节。
是的,主要区别是SurfaceView可以在后台线程上更新。 但是,你可能会关心更多。
-
surfaceView有专门的表面缓冲区,而所有的视图共享一个由ViewRoot分配的表面缓冲区。 换句话说,surfaceView花费更多的资源。
-
surfaceView不能被硬件加速(从JB4.2开始),而普通视图的95%的操作是使用openGL ES进行硬件加速的。
-
应该做更多的工作来创build自定义的surfaceView。 你需要侦听到surfaceCreated / Destroy Event,创build一个渲染线程,更重要的是同步渲染线程和主线程。 但是,要自定义视图,您只需要重写
onDraw
方法。 - 更新的时机不同。 普通视图更新机制是由框架约束或控制的:您
view.invalidate
在UI线程中调用view.invalidate
,或者在其他线程中调用view.invalidate
来向框架指示应该更新视图。 但是,视图不会立即更新,而是等到下一个VSYNC事件到达。 理解VYSNC的简单方法是把它看作一个计时器,每隔16ms触发60fps的屏幕。 在Android中,所有正常的视图更新(实际上显示但我今天不会说),与VSYNC同步以达到更好的平滑度。 现在,回到surfaceView,你可以随时渲染它,如你所愿。 但是,如前所述,由于显示器也与VSNC同步,所以我几乎不知道它是否有优势。
主要区别是SurfaceView
可以通过背景绘制,但Views
不能。 SurfaceViews
使用更多的资源,所以你不想使用它们,除非必须。
SurfaceView
是Android中的一个自定义视图,可用于在其中绘制。
View
和SurfaceView
之间的主要区别是在UI Thread
绘制了一个View,用于所有的用户交互。
如果你想足够快地更新用户界面,并在其中渲染大量的信息,SurfaceView是一个更好的select。
但SurfaceView
有一些技术SurfaceView
:
1.他们没有硬件加速。
2.当您调用方法invalidate
或postInvalidate()
时会呈现普通视图,但这并不意味着视图将被立即更新( VSYNC
将被发送,操作系统决定何时更新) SurfaceView
可以立即更新。
3. SurfaceView有一个分配的surface buffer
,所以成本更高
Surfaceview和视图之间的主要区别之一是,为了刷新正常视图的屏幕,我们必须从定义视图的相同线程中调用invalidate方法。 但即使我们称之为无效,刷新也不会立即发生。 它只发生在VSYNC信号的下一个到达之后。 VSYNC信号是每16.6毫秒发生一次内核产生的信号,或者这也被称为每秒60帧。 所以如果我们想更好的控制屏幕的刷新(比如对于快速移动的animation),我们不应该使用普通的视图类。
另一方面,在surfaceview的情况下,我们可以尽快刷新屏幕,我们可以从后台线程中完成。 因此,表面视图的清爽真的不依赖于VSYNC,如果我们想要做高速animation,这是非常有用的。 我很less有培训video和示例应用程序,很好地解释了所有这些事情。 请看下面的培训video。
另一个定义是:
SurfaceView是一个特殊的视图,可以让你直接在屏幕上显示内容。
来源:大书呆子牧场指南