安卓SurfaceFlinger

36

我想问一下,无论是什么类型的屏幕绘制,SurfaceFlinger是否总是被调用? 例如,将JPG文件显示到屏幕上。

3个回答

38

SurfaceFlinger并不是绘制窗口的工具。它为您的窗口分配了一个帧缓冲区,由运行在应用程序中的框架直接绘制到其中而不与SurfaceFlinger交互。当您绘制完一帧后,SurfaceFlinger仅涉及将最终的新帧缓冲合成到屏幕上。


1
感谢hackbod和Frank提供的信息。我对SurfaceFlinger感到非常困惑。当我查看Android文档http://developer.android.com/guide/topics/graphics/index.html时,有两种方法可以将2D图形绘制到屏幕上。一种是在View上,另一种是在SurfaceView上。我已经检查了SurfaceView的源代码,它似乎实际上正在与SurfaceFlinger交互。然而,我还没有看到使用View(例如ImageView)在Canvas中进行绘制的连接,因为它似乎调用SKIA库。 - artsylar
1
我认为Android图形是从WindowManager组件获取表面的。这个表面实际上是由SurfaceFlinger创建并由WindowManager管理的。我的理解正确吗? - artsylar
首先,除非您正在平台本身中编码,否则您根本不需要关心SurfaceFlinger,所以不要担心它。常规视图和SurfaceView之间的区别实际上与SurfaceFlinger无关;SurfaceView本质上是创建窗口的另一种方式,并且该窗口附加到SurfaceView的视图层次结构的窗口上。同样,除非您正在修改平台,否则这对您来说并不重要。我真的建议您询问有关您要做什么的问题,而不是如何工作,这样人们可以给您有用的答案。 - hackbod
6
感谢您的回复。实际上,我目前还没有开发 Android 应用程序,但我将在不久的将来开始。我只是想了解 Android 的工作原理。因为我不仅在学习应用程序框架,还对库层感兴趣。 - artsylar
有时它会释放并重新创建,因此在同一个应用程序中会出现重复的相同活动。 - Jeff Bootsholz

21

SurfaceFlinger是Android系统服务,负责将所有应用程序和系统表面合成到单个缓冲区中,最终由显示控制器显示。

让我们详细了解上述语句。

SurfaceFlinger是一个系统级服务,但应用开发人员不能像传感器或其他服务一样直接使用它。每次您想要更新UI时,SurfaceFlinger都会介入。这就是为什么SurfaceFlinger会耗费电池的原因。

除了您的应用程序表面,还有系统表面,包括状态栏、导航栏,以及在发生旋转时,系统为旋转动画创建的表面。大多数应用程序只有一个活动表面 - 当前前台活动表面,其他应用程序在视图层次结构中使用SurfaceView或使用演示模式时会有多个表面。

SurfaceFlinger负责合成所有这些表面。常见的误解是SurfaceFinger用于绘制,这是不正确的。绘图是OpenGL的工作。有趣的是,SurfaceFlinger也使用OpenGL进行合成。

合成结果将放置在系统缓冲区或本地窗口中,这是显示控制器获取数据的源。这就是您在屏幕上看到的东西。


17

SurfaceFlinger是Android的合成器,它会获取所有要显示的内容,计算出最终的帧图像,然后通过显卡的EGL接口将其发送到屏幕上进行显示。

你可以从Android开发者Jeff Sharkey的一篇文章中了解到它控制着你在一个帖子中看到的所有内容的结果,他在这篇文章中展示了夜间模式下对整个屏幕进行色调处理的效果。我还找到了一份关于这个主题很好的幻灯片演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接