【发布时间】:2011-04-18 06:03:49
【问题描述】:
我想问一下,是否总是调用 SurfaceFlinger 来在屏幕上进行任何类型的绘图? 例如,在屏幕上显示 JPG 文件。
【问题讨论】:
标签: android graphics surfaceflinger
我想问一下,是否总是调用 SurfaceFlinger 来在屏幕上进行任何类型的绘图? 例如,在屏幕上显示 JPG 文件。
【问题讨论】:
标签: android graphics surfaceflinger
SurfaceFlinger 不是 绘制你的窗口的东西。它为您的窗口分配一个帧缓冲区,在您的应用程序中运行的框架直接绘制到该窗口,而不与 SurfaceFlinger 交互。绘制窗口时,SurfaceFlinger 所涉及的唯一交互是在绘制完帧后将最终的新帧缓冲区合成到屏幕上。
【讨论】:
是的,SurfaceFlinger 是 Android 的合成器,因此它获取所有将要显示的内容,计算出生成的帧的外观,然后将其发送出去,通过显卡的 EGL 接口显示在屏幕上。
在 Android 开发人员 Jeff Sharkey 的 tints the whole screen for nightmode 的帖子中,您可以了解到它控制您看到的所有内容的结果。我还发现了一个看起来不错的关于 this topic 的投影仪演示文稿。
【讨论】:
http://pierrchen.blogspot.jp/2014/02/what-is-surfaceflinger-in-android.html
SurfaceFlinger 是一个 Android 系统服务,负责 将所有应用程序和系统表面组合成一个单一的 最终由显示控制器显示的缓冲区。
让我们放大上面的语句。
SurfaceFlinger 是一个系统范围的服务,但它不是直接的 作为传感器或其他服务可供应用程序开发人员使用 是。每次你想更新你的 UI 时,SurfaceFlinger 都会启动 中。这解释了为什么 SurfaceFlinger 是电池消耗器。
除了你的应用表面,还有系统表面, 包括状态栏、导航栏,以及在发生旋转时, 系统为旋转动画创建的曲面。最多 应用程序只有一个活动表面 - 当前的一个 前台活动,当 SurfaceView 为其他活动时,其他活动不止一个 在视图层次结构或演示模式中使用。
SurfaceFlinger 负责合成所有这些表面。一种 常见的误解是 SurfaceFinger 是用于 DRAWING 的。它是 不正确。绘图是 OpenGL 的工作。有趣的是 SurfaceFlinger 也使用 openGL 进行合成。
合成结果将被放入系统缓冲区或本地 窗口,这是显示控制器从中获取数据的源。 这就是您在屏幕上看到的内容。
【讨论】: