Answers:
所有视图均在同一GUI线程上绘制,该GUI线程也用于所有用户交互。
因此,如果您需要快速更新GUI或渲染花费太多时间并影响用户体验,请使用SurfaceView
。
我注意到的几件事:
有关更多信息(以及出色的用法示例),请参阅SDK的示例部分中的LunarLander项目。
更新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同步,因此我很难说出它是否有优势。主要区别在于SurfaceView
可以通过背景广告进行绘制,但Views
不能。
SurfaceViews
尽管要使用更多的资源,所以除非有必要,否则您不想使用它们。
A SurfaceView
是Android中的自定义视图,可用于在其中绘制。
a View
和a 之间的主要区别SurfaceView
是在中绘制了一个View,该视图
UI Thread
用于所有用户交互。
如果要足够快地更新UI并在其中呈现大量信息,则SurfaceView是更好的选择。
但是,有一些技术方面的知识SurfaceView
:
1. 它们不是硬件加速的。
2. 当调用方法invalidate
或时postInvalidate()
,将呈现普通视图,但这并不意味着视图将立即更新(VSYNC
将发送一个视图,操作系统将决定何时更新该视图。SurfaceView
可以立即更新。)
3 . SurfaceView具有分配的surface buffer
,因此成本更高
表面视图和视图之间的主要区别之一是,要刷新普通视图的屏幕,我们必须从定义视图的同一线程调用无效方法。但是,即使我们调用无效,刷新也不会立即发生。它仅在下一次到达VSYNC信号之后发生。VSYNC信号是内核生成的信号,每16.6 ms发生一次,或者也称为每秒60帧。因此,如果我们想更好地控制屏幕的刷新(例如,对于快速移动的动画),则不应使用普通的视图类。
另一方面,在使用Surfaceview的情况下,我们可以根据需要尽快刷新屏幕,并且可以从后台线程进行刷新。因此,刷新表面视图确实不依赖于VSYNC,如果我们要进行高速动画制作,这非常有用。我几乎没有培训视频和示例应用程序,它们很好地解释了所有这些内容。请观看以下培训视频。
为什么要使用SurfaceView而不是经典的View类...
主要原因之一是SurfaceView可以快速渲染屏幕。
用简单的话来说,SV更有能力管理时序和渲染动画。
为了更好地了解什么是SurfaceView,我们必须将其与View类进行比较。
有什么区别...请在视频中查看以下简单说明
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
有了View,我们有一个主要问题。...渲染动画的时间。
通常,onDraw()是从Android运行时系统调用的。
因此,当Android运行时系统调用onDraw()时,应用程序将无法控制
显示的时间,这对于动画很重要。我们有时间差
在应用程序(我们的游戏)和Android运行时系统之间切换。
SV可以通过专用线程调用onDraw()。
因此:应用程序控制时间。这样我们就可以显示动画的下一个位图图像。