surfaceflinger(学习surfaceflinger 有什么用)
本文目录
- 学习surfaceflinger 有什么用
- 如何dump surfaceflinger的数据
- android opengl es与surfaceview什么关系
- 如何在Android上实现FrameBuffer和Overlay的blend
- 如何跨进程调用surfaceflinger的方法
- O大,请问 surfaceflinger 是什么,在系统里最耗电
学习surfaceflinger 有什么用
SurfaceFlinger英文直译就是surface的投递者,surface就不用翻译了,翻译了反而不好理解。SurfaceFlinger是android的一个服务,其负责管理应用端的surface,将所有的surface复合。他是介于图形库和应用之间的一层。每个应用在它自己的surface完成各种图形操作后,请求SurfaceFlinger显示到屏幕,surfaceflinger就会将所有的surface叠加起来,并且反映到framebuffer.
如何dump surfaceflinger的数据
hi.你说的surfaceflinger应该是指安卓的surfaceflinger.可以使用如下命令:dumpsys SurfaceFlinger就能抓到surfaceflinger的一些信息,一般包含:1、layer的信息,layer一般对应于一个surface2、opengl的信息。一般是跟gpu比较相关的参数,opengl是标准的接口,需要获取gpu底层的一些支持特性,比如支持最高api版本为opengl es2.0,还有一些扩展信息3、display。安卓支持三种类型的display,可以导出display当前的显示状态,也就是各个surface(layer)在各个display的显示属性4、surfaceflinger管理graphis buffer的信息。主要是layer申请的帧数据内存5、hwcomopser的如果实现dump接口也能知道hwcomposer的一些参数6、gralloc的内存分配信息。如果gralloc有实现dump接口的话以上是一些简单的概括,希望对你有帮助
android opengl es与surfaceview什么关系
1.SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。 2.DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。加载FrameBuffer和Overlay插件,并初始化OpenGLES: view plain mNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow-》getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context); 3.FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer: queueBuffer负责显示一个Buffer到屏幕上,它调用fb-》post去显示。 dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。 这两个函数由eglSwapBuffers调过来,调到 view plain egl_window_surface_v2_t::swapBuffers: nativeWindow-》queueBuffer(nativeWindow, buffer); nativeWindow-》dequeueBuffer(nativeWindow, &buffer); 4.msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作: OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度: view plain bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) { ov.dst_rect.x = x; ov.dst_rect.y = y; ov.dst_rect.w = w; ov.dst_rect.h = h; ioctl(mFD, MSMFB_OVERLAY_SET, &ov); } OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer: view plain bool OverlayDataChannel::queueBuffer(uint32_t offset) { mOvData.data.offset = offset; ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr)) } 5.msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。 6.msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式: copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。 copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。 7.pmem misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。 board-msm7x27.c定义了物理内存的缺省大小: view plain #define MSM_PMEM_MDP_SIZE 0x1B76000 #define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M #define PMEM_KERNEL_EBI1_SIZE 0x1C00 msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。 8.KGSL Kernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。 9.msm_hw3dm 这个我在内核中没有找到相关代码。 10.msm_fb msm_fb.c: framebuffer, overlay和blit的用户接口。 mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式: mdp_refresh_screen: 定时更新。 mdp_dma_pan_update: 通过pan display主动更新。 mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。
如何在Android上实现FrameBuffer和Overlay的blend
1.SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。2.DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。加载FrameBuffer和Overlay插件,并初始化OpenGLES:view plainmNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow-》getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context); 3.FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:queueBuffer负责显示一个Buffer到屏幕上,它调用fb-》post去显示。dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。这两个函数由eglSwapBuffers调过来,调到view plainegl_window_surface_v2_t::swapBuffers: nativeWindow-》queueBuffer(nativeWindow, buffer); nativeWindow-》dequeueBuffer(nativeWindow, &buffer); 4.msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:view plainbool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) { ov.dst_rect.x = x; ov.dst_rect.y = y; ov.dst_rect.w = w; ov.dst_rect.h = h; ioctl(mFD, MSMFB_OVERLAY_SET, &ov); } OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer:view plainbool OverlayDataChannel::queueBuffer(uint32_t offset) { mOvData.data.offset = offset; ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr)) } 5.msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。6.msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式:copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。7.pmemmisc/pmem.c: 对物理内存的管理,算法和用户空间的接口。board-msm7x27.c定义了物理内存的缺省大小:view plain#define MSM_PMEM_MDP_SIZE 0x1B76000 #define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M #define PMEM_KERNEL_EBI1_SIZE 0x1C00 msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。8.KGSLKernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。9.msm_hw3dm这个我在内核中没有找到相关代码。10.msm_fbmsm_fb.c: framebuffer, overlay和blit的用户接口。mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式:mdp_refresh_screen: 定时更新。mdp_dma_pan_update: 通过pan display主动更新。mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。
如何跨进程调用surfaceflinger的方法
Android SurfaceFlinger 详解 1. SurfaceFlinger 按英文翻译过来就 Surface 投递者。 就是把上层所画的各个 surface 进行处 理然后传给底层硬件来显示的一个功能。 2. 下图比较详细的阐述了 SurfaceFlinger 所起的作用。 Android 图形系统中一个重要的概念和线索是 surface。View 及其子类(如 TextView, Button) 要画在 surface 上。 每个 surface 创建一个 Canvas 对象 (但 属性时常改变),用来管理 view 在 surface 上的绘图操作,如画点画线。每个 canvas 对象对应一个 bitmap,存储画在 surface 上的内容。 每个 Surface 通常对应两个 buffer,一个 front buffer, 一个 back buffer。 其中,back buffer 就是 canvas 绘图时对应的 bitmap。因此,绘画总是在 back buffer 上,需要更新时,则将 back buffer 和 front buffer 互换。 The window is tied to a Surface and the ViewRoot asks the Surface for a Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot will call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces() which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer Except for SurfaceViews, different views within the same ViewRoot share the same surface. Layer 的概念: 每个 surface 又对应一个 layer, SurfaceFlinger 负责将各个 layer 的 front buffer 合成(composite)绘制到屏幕上。 A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don’t have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer Multiple layers are just composited to the final buffer in their Z order. 有几个对象与 Surface 概念紧密相关: 1. Java Surface (frameworks/base/core/java/android/view/Surface.java) 。 该对象被应用间接调用(通过 SurfaceView, ViewRoot 等), 应用需要创建 surface,(并同时创建 canvas), 将图形绘制到这个对象上并最终投递到屏幕 上。 2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被 Java Surface 通过 Jni 调用,实现 Java Surface 的功能 3. ISurface (以及其派生类 BnSurface)。这个对象是应用和 server 之间的接 口。 C++ Surface 创建这个 ISurface (BnSurface) 并发送命令, 如更新 surface 内容到屏幕上。Server 端接受这个命令并执行相应操作。 研究一个 surface 如何创建的关键路径如下: 1. frameworks/base/core/java/android/view/Surface.java Surface::Surface () -- 2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。 在这个函数中 SurfaceComposerClient 对象被创建。 3.frameworks/base/libs/ui/SurfaceComposerClient.cpp SurfaceComposerClient::SurfaceComposerClient (). 这个函数非常重要,在这里建立了 client 和 server 之间的桥梁。通过函数 _get_surface_manager() 获 得 了 一 个 指 向 server 的 IBinder 对 象 ( 具 有 ISurfaceComposer 接口),之后通过这个 IBinder 就可以跨进程访问 Server 的 功能。接着调用 ISurfaceComposer::createConnection()创建并返回了一个 ISurfaceFlingerClient 的 IBinder。 4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -SurfaceComposerClient::createSurface(). 这 个 函 数 中 , 利 用 前 面 获 得 的 ISurfaceFlingerClient 的 IBinder,调用其 createSurface 接口。 5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -BClient::createSurface ()。BClient 由 ISurfaceFlingerClient 派生而来。 6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -SurfaceFlinger:: createSurface()。这个函数为 Surface 创建一个对应的 Layer。 上述关键路径中,1,2,3,4 运行于 client 进程中,而 5,6 运行与 server 进 程中。server 作为一个 service 提供给 client 访问。 与图形相关的代码主要位于下列目录: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget 4、frameworks/base/opengl/ 5、frameworks/base/libs/ui 6、frameworks/base/libs/surfaceflinger 7、frameworks/base/core/jni/android/graphics 8、frameworks/base/core/jni/android/opengl 9、frameworks/base/core/jni/android/android_view_*.cpp 10、external/skia 一、下列目录中的部分代码: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget android.graphics, android.view 和 android.widget 功能和其他类似的图形库 如 Qt/Gtk+差不多, 分别提供基本的图形原语 (如画点画线, 设置图形上下文等) , 事件机制, 以及开发图形用户界面的控件等。 canvas 用于开发 2D 图形, Surface 代表一个可供图形系统绘制的 surface。可在其上绘制 2D 活 3D 图形。
O大,请问 surfaceflinger 是什么,在系统里最耗电
关 于耗电的问题,是多种原因引起的,其中最主要的原因是有些应用不能正常退出,一直在后台运行。请进入设置-电 量,查看哪 些应用消耗 了过多的电量。可以在桌面长按home键,清除不需要在后台运行的程序,这样可以显著减少电量的消耗。
更多文章:
javascript常用内置对象(javascript内置对象有哪些)
2024年7月23日 20:07
stones是什么意思(sticks and stones究竟是啥意思)
2023年7月18日 15:20
int型数组的长度(C语言的char,short,int和long类型分别有多长)
2024年6月30日 10:15
net user更改管理员密码(user可以通过cmd更改administrator的密码吗)
2024年6月25日 04:17
matlab中patch函数的用法(matlab中如何获取patch函数画出多面体得网格坐标(x,y,z))
2024年7月2日 19:55
in the manner of(in the matter of 是什么意思)
2024年7月15日 06:49
javaee小型项目(eclipsejavaee项目如何查看首页)
2024年7月12日 03:10
ifrow函数的使用方法(excel中if函数怎么用里面有三个值,)
2024年7月23日 06:53