何时需要或更好地使用SurfaceView
代替View
?
答案 0 :(得分:201)
视图全部绘制在同一个GUI线程上,该线程也用于所有用户交互。
因此,如果您需要快速更新GUI或者渲染需要花费太多时间并影响用户体验,请使用SurfaceView
。
答案 1 :(得分:100)
我注意到的一些事情:
有关更多信息(以及一个很好的用法示例),请参阅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
方法。
view.invalidate
或在其他线程中调用view.postInvalid
以向框架指示应该更新视图。但是,视图不会立即更新,而是等到下一个VSYNC事件到达。理解VSYNC的简单方法是将其视为一个计时器,在60fps屏幕上每16ms启动一次。在Android中,所有普通视图更新(实际显示但我今天不会说它)与VSYNC同步以获得更好的平滑度。现在,回到surfaceView,您可以随时随地渲染它。但是,我很难说它是否有优势,因为显示器也与VSYNC同步,如前所述。答案 3 :(得分:43)
主要区别在于SurfaceView
可以由背景theads绘制,但Views
不能。
SurfaceViews
使用更多资源,因此除非必须,否则不要使用它们。
答案 4 :(得分:12)
SurfaceView
是Android中的自定义视图,可用于在其中绘制。
View
和SurfaceView
之间的主要区别在于,绘制了一个视图
UI Thread
,用于所有用户互动。
如果您想要足够快地更新UI并在其中呈现大量信息
它,SurfaceView是一个更好的选择。
但是SurfaceView
还有一些技术内容:
1。它们不是硬件加速的。
2。调用方法invalidate
或postInvalidate()
时会呈现正常视图,但这并不意味着视图将是
立即更新(A VSYNC
将被发送,操作系统决定何时
它得到更新。 SurfaceView
可以立即更新。
3。 SurfaceView已分配surface buffer
,因此成本更高
答案 5 :(得分:7)
surfaceview和view之间的主要区别之一是要刷新普通视图的屏幕,我们必须从定义视图的同一线程调用invalidate方法。但即使我们调用invalidate,刷新也不会立即发生。它仅在下一次到达VSYNC信号后发生。 VSYNC信号是内核生成的信号,每16.6 ms发生一次,或者也称为每秒60帧。因此,如果我们想要更多地控制屏幕的刷新(例如对于非常快速移动的动画),我们就不应该使用普通的视图类。
另一方面,在surfaceview的情况下,我们可以尽快刷新屏幕,我们可以从后台线程中完成。因此,faceview的清新真的不依赖于VSYNC,如果我们想要进行高速动画,这非常有用。我很少有培训视频和示例应用程序可以很好地解释所有这些事情。请查看以下培训视频。
答案 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()。
因此:该应用程序控制时间。这样我们就可以显示动画的下一个位图图像。