【问题标题】:Using Multiple Surfaces Views For Optimization?使用多个表面视图进行优化?
【发布时间】:2015-09-19 12:18:09
【问题描述】:

情况

我开始为 Android 开发,发现 Android 处理布局、动画等的方式不足以实现流畅的触摸反馈和实时动画,尤其是在 Android 4.0 之前。因此,我决定使用游戏应用方法:使用SurfaceView 并定义我自己的绘图代码。

问题

经过几次测试,我发现这种方法对于非游戏应用程序需要过多的 CPU,我认为这是由于每秒重绘静态元素 60 次造成的。

第一个解决方案和缺陷

为了解决这个问题,我修改了我的代码,以便应用程序仅在应该绘制的内容发生任何更改时才重新绘制屏幕(调用postInvalidate)。此解决方案解决了部分问题,但即使小按钮移动了一个像素,应用程序仍必须重绘静态元素。

问题:可能的更好解决方案?

为了更好的解决方案,我考虑了Android是如何处理这个问题的;每个屏幕元素都有单独的View。所以我虽然,也许我可以有一个SurfaceView 用于大型、静态、内容元素,另一个用于小型、移动的 UI 元素,并实现类似的效果。我的问题是,这真的会像我上面描述的那样提高性能吗?

谢谢。

【问题讨论】:

    标签: android optimization android-view surfaceview


    【解决方案1】:
    1. 如果您使用的是postInvalidate(),您应该使用custom View,而不是SurfaceView。使用 SurfaceView 的全部意义在于拥有一个独立于 View UI 的单独层。如果您要覆盖onDraw(),那么您是在 View 部分而不是 Surface 部分上绘图,并且只是在浪费 Surface。

    2. 所有视图都占据一个层,无论您有多少。每个 SurfaceView 都有一个单独的层,因此拥有很多会成为问题。实际上,由于 Z 排序限制,您最多只能有三个。 (请参阅Grafika 中的“多表面测试”活动,了解三个部分透明的 SurfaceView 与 View UI 混合的示例。)

    3. 如果您无法以足够快的速度进行渲染以维持 60 fps,则需要考虑更改渲染方式。自定义视图和 OpenGL ES 利用了硬件加速。画布渲染到 SurfaceView 表面不会。从好的方面来说,您可以缩小 SurfaceView 的 Surface 尺寸并让硬件对其进行扩展;这使您可以限制必须绘制每帧的像素数,而不管显示器的分辨率如何。 (Blogdemo。)如果你有很多静态元素,最好的方法可能是渲染到屏幕外的位图,然后每帧对位图进行 blit。

    一种非常快速的方法是将所有静态元素渲染到 SurfaceView 的 View 部分,注意保持背景透明,然后使用 GLES 在 Surface 上渲染动画部分。您可以使用第二个 SurfaceView,但这会增加一个额外的合成层,如果您超过硬件支持的覆盖平面数量,这将降低系统性能。

    要更深入地了解 Android 图形的工作方式,请查看graphics architecture doc

    【讨论】:

    • 实际上,我所说的 SurfaceView 是指扩展 SurfaceView 的自定义视图类,它会覆盖 onDraw()。在调用lockCanvas() 之后,我从一个单独的线程调用postInvalidate()。在测试设备上运行我的应用程序,canvas.isHardwareAccelerated() 实际上返回true。这算作在 Surface 零件上绘图吗?我会先浏览您提供的所有链接,但看起来需要相当长的时间才能接受,所以......我很抱歉。
    • SurfaceView 有两个部分,Surface 和 View。 View 部分与其他 View 元素一样工作,onDraw() 被称为无效/重绘周期的一部分,并且是硬件加速的。 Surface部分是一个完全独立的层,位于View UI的后面;它可以用 Canvas 用软件渲染,用 OpenGL ES 用硬件渲染,从 Camera 或视频解码器接收帧等。如果你不在 View 部分上绘制,View 只是作为一个透明窗口,让你看到 Surface在后面。 (布局代码需要有一些可以衡量的东西。)
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2015-05-09
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多