【问题标题】:Difference between SurfaceView and View?SurfaceView 和 View 的区别?
【发布时间】:2010-11-17 14:58:36
【问题描述】:

什么时候需要,或者最好使用SurfaceView 而不是View

【问题讨论】:

    标签: android graphics 2d


    【解决方案1】:

    主要区别在于SurfaceView 可以由背景头绘制,但Views 不能。 SurfaceViews 使用更多资源,所以除非你必须,否则你不想使用它们。

    【讨论】:

    • "他们使用更多的资源,所以你不想使用它们,除非你必须这样做。" - 谁使用更多的资源?视图还是 SurfaceView?
    • Surfaceview 使用比视图更多的资源
    • @RiteshGune 多少钱?
    • 我们什么时候必须
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    我注意到了一些事情:

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

    有关更多信息(和一个很好的使用示例),请参阅 SDK 中的 LunarLander 项目 的示例部分。

    【讨论】:

    • 仅供参考...SurfaceView 现在可以是透明的:stackoverflow.com/questions/5391089/…
    • @Ralphleon:Surface Views 不能透明是什么意思?其他视图可以与 Surface 视图重叠吗?例如,我可以在 Surface 视图上临时显示 ListView 吗?
    【解决方案4】:

    2014 年 5 月 9 日更新

    好的。我们有 official document now. 它以更好的方式说出了我提到的所有内容。


    阅读更多详情here

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

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

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

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

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

    【讨论】:

    • 从您的回答中,我觉得使用派生自 View 的类比使用 SurfaceView 更好。还是我有什么问题?这与大多数 2D 游戏开发教程相反。
    • @Storm 需要考虑的一点是,SurfaceView 的设计不应阻塞 UI 线程,其中 View 只能由 UI 线程修改。对于大多数游戏,SurfaceViews 会进行大量渲染,这会用简单的视图阻塞 UI 线程。据我了解,这是 SurfaceView 的主要好处。
    • 创建渲染线程是什么意思。我们每次都要手动创建?
    【解决方案5】:

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

    ViewSurfaceView 之间的主要区别在于视图是在 UI Thread,用于所有用户交互。

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

    但是SurfaceView 有一些技术内幕:

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

    2. 当您调用 invalidatepostInvalidate() 方法时,会呈现普通视图,但这并不意味着视图将是 立即更新(将发送VSYNC,操作系统决定何时 它得到更新。 SurfaceView 可以立即更新。

    3.一个 SurfaceView 有一个分配的surface buffer,所以成本更高

    【讨论】:

    • 为什么让硬件加速很重要?
    【解决方案6】:

    surfaceview 和视图之间的主要区别之一是,要刷新屏幕以获得普通视图,我们必须从定义视图的同一线程调用 invalidate 方法。但即使我们调用无效,刷新也不会立即发生。它仅在 VSYNC 信号下一次到达之后发生。 VSYNC 信号是内核生成的信号,每 16.6 毫秒发生一次,也称为每秒 60 帧。所以如果我们想要更多地控制屏幕的刷新(例如非常快速移动的动画),我们不应该使用普通视图类。

    另一方面,在 SurfaceView 的情况下,我们可以尽可能快地刷新屏幕,并且可以从后台线程中完成。所以表面视图的刷新真的不依赖于VSYNC,如果我们想做高速动画,这非常有用。我很少有培训视频和示例应用程序可以很好地解释所有这些事情。请观看以下培训视频。

    https://youtu.be/kRqsoApOr9U

    https://youtu.be/Ji84HJ85FIQ

    https://youtu.be/U8igPoyrUf8

    【讨论】:

      【解决方案7】:

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

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

      简单来说,SV 更能管理时间和渲染动画。

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

      有什么区别...查看视频中的这个简单说明

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

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多