【发布时间】:2010-11-17 14:58:36
【问题描述】:
什么时候需要,或者最好使用SurfaceView 而不是View?
【问题讨论】:
什么时候需要,或者最好使用SurfaceView 而不是View?
【问题讨论】:
主要区别在于SurfaceView 可以由背景头绘制,但Views 不能。
SurfaceViews 使用更多资源,所以除非你必须,否则你不想使用它们。
【讨论】:
所有视图都绘制在同一个 GUI 线程上,该线程也用于所有用户交互。
因此,如果您需要快速更新 GUI,或者如果渲染耗时过多并影响用户体验,请使用SurfaceView。
【讨论】:
我注意到了一些事情:
有关更多信息(和一个很好的使用示例),请参阅 SDK 中的 LunarLander 项目 的示例部分。
【讨论】:
2014 年 5 月 9 日更新
好的。我们有 official document now. 它以更好的方式说出了我提到的所有内容。
阅读更多详情here。
是的,主要区别是surfaceView可以在后台线程上更新。但是,您可能关心的还有更多。
surfaceView 具有专用的表面缓冲区,而所有视图共享一个由 ViewRoot 分配的表面缓冲区。换句话说,surfaceView 消耗更多资源。
surfaceView 不能进行硬件加速(从 JB4.2 开始),而普通 View 上 95% 的操作是使用 openGL ES 进行硬件加速的。
应该做更多的工作来创建您的自定义表面视图。需要监听surfaceCreated/Destroy事件,创建渲染线程,更重要的是同步渲染线程和主线程。但是,要自定义 View,您需要做的就是覆盖 onDraw 方法。
view.invalidate 或在其他线程中调用view.postInvalid 来向框架指示应该更新视图。但是,视图不会立即更新,而是等到下一个 VSYNC 事件到达。理解 VSYNC 的简单方法是将其视为一个计时器,每 16 毫秒触发一次,以达到 60 fps 的屏幕。在 Android 中,所有正常的视图更新(实际上是显示,但我今天不讲)都与 VSYNC 同步,以实现更好的平滑度。现在,回到surfaceView,你可以随心所欲地渲染它。但是,我很难判断这是否是一种优势,因为如前所述,显示器也与 VSYNC 同步。【讨论】:
SurfaceView 是 Android 中的自定义视图,可用于在其中绘制。View 和 SurfaceView 之间的主要区别在于视图是在
UI Thread,用于所有用户交互。
如果您想足够快地更新 UI 并在其中呈现大量信息
它,SurfaceView 是更好的选择。
但是SurfaceView 有一些技术内幕:
1. 它们不是硬件加速的。
2. 当您调用 invalidate 或 postInvalidate() 方法时,会呈现普通视图,但这并不意味着视图将是
立即更新(将发送VSYNC,操作系统决定何时
它得到更新。 SurfaceView 可以立即更新。
3.一个 SurfaceView 有一个分配的surface buffer,所以成本更高
【讨论】:
surfaceview 和视图之间的主要区别之一是,要刷新屏幕以获得普通视图,我们必须从定义视图的同一线程调用 invalidate 方法。但即使我们调用无效,刷新也不会立即发生。它仅在 VSYNC 信号下一次到达之后发生。 VSYNC 信号是内核生成的信号,每 16.6 毫秒发生一次,也称为每秒 60 帧。所以如果我们想要更多地控制屏幕的刷新(例如非常快速移动的动画),我们不应该使用普通视图类。
另一方面,在 SurfaceView 的情况下,我们可以尽可能快地刷新屏幕,并且可以从后台线程中完成。所以表面视图的刷新真的不依赖于VSYNC,如果我们想做高速动画,这非常有用。我很少有培训视频和示例应用程序可以很好地解释所有这些事情。请观看以下培训视频。
【讨论】:
为什么要使用 SurfaceView 而不是经典的 View 类...
一个主要原因是 SurfaceView 可以快速渲染屏幕。
简单来说,SV 更能管理时间和渲染动画。
为了更好地理解什么是 SurfaceView,我们必须将其与 View 类进行比较。
有什么区别...查看视频中的这个简单说明
https://m.youtube.com/watch?feature=youtu.be&v=eltlqsHSG30
对于 View,我们有一个主要问题....渲染动画的时间。
通常从 Android 运行时系统调用 onDraw()。
所以,当 Android 运行时系统调用 onDraw() 时,应用程序无法控制
显示的时间,这对动画很重要。我们有时间上的差距
在应用程序(我们的游戏)和 Android 运行时系统之间。
它可以通过专用线程调用 onDraw() 的 SV。
因此:应用程序控制时间。这样我们就可以显示动画的下一个位图图像了。
【讨论】: