是否有对表面,表面持有人,eglsurface,surfaceview,glsurfaceview,surfaceTextule和textureView的详细说明?特别是: SurfaceView和TextureView之间有什么区别? 我需要使用glsurfaceview使用OpenGL ES? 表面和eglsurface如何相互作用? SurfaceTexture做什么? 为什么我在SurfaceView上绘制的东西必须超过或下方? 什么是SurfaceFlinger? 状态和导航栏的组成如何工作? 当我们使用它时,在Android上构建游戏循环的正确方法是什么? 解决方案 现在可以在Android开源项目网站上找到这些和许多其他问题的答案: Android System-Level Graphics 该文档以低级基础架构的解释开始,然后解释如何从中构建高级功能.目的是不是为常见问题提供直接答案,而是要以一个细节来描述系统,这使得答案显而易见而
以下是关于 surfaceflinger 的编程技术问答
我正在使用虚拟显示器从Android模拟器中获取屏幕截图,我注意到 surfaceflinger 的内存具有无限的生长(可以在 top 程序中看到)和一段时间后,模拟器停止工作.在真实的Android设备上,一切都可以正常工作:内存增加了5MB,然后将其清除.但是,在模拟器上,例如Genymotion和LDPlayer SurfaceFlinger的作品异常起作用. 我尝试了创建VirtualDisplay的两种不同的方法:通过1)ImageReader或2)GLES: Imagereader val handlerThread = HandlerThread( javaClass.simpleName, Process.THREAD_PRIORITY_BACKGROUND ).apply { start() } val handler = Handler(handlerThrea
我想在Android中编写一个本机应用程序进行测试 SurfaceFlinger.是否有任何简单的程序显示如何创建 表面,寄存器缓冲区和邮政缓冲区. 解决方案 frameworks/base/libs/surfaceflinger/tests/resize/resize.cpp是一个很好的起点. 但是我的版本(来自供应商的eclair)已过时,某些Surface API已移动到SurfaceControl,您必须: SurfaceComposerClient::createSurface() => SurfaceControl SurfaceControl->getSurface() => Surface 其次使用SurfaceComposerClient::openTransaction()/closeTransaction() 将所有交易结合到SurfaceFlinger表面,例如: Surface::lock()/unlockAndPost()和SurfaceC
我只想询问SurfaceFlinger是否总是要求任何类型的绘制到屏幕上? 例如,将JPG文件显示到屏幕上. 解决方案 SurfaceFlinger是不是什么吸引了您的窗口.它为您的窗口分配一个框架缓冲区,应用程序中运行的框架直接绘制到无需与SurfaceFlinger交互的情况下.当您绘制窗口时,唯一涉及SurfaceFlinger是将最终的新框架缓冲区复合到屏幕上的最终新框架缓冲区. 其他解决方案 . SurfaceFlinger是一种Android系统服务,负责 将所有应用程序和系统表面组合成一个 最终将通过显示控制器显示的缓冲区. 让我们放大上述语句. SurfaceFlinger是一项系统范围的服务,但不是直接 应用程序开发人员可以作为传感器或其他服务可以 是.每次您想更新UI时,SurfaceFlinger都会踢 in.这解释了为什么SurfaceFlinger是电池排水器. 除了您的应用程序表面,还有系统表面, 包括状态栏,导航栏以及
在Systrace工具中真的很奇怪,当我看到SurfaceFlinger的绘图命令和窗口组合时,这在CPU上运行但不在GPU上运行.但根据谷歌的漫画,他们认为这种构图和绘图命令的执行是在GPU上执行的.我的设备具有GPU,即使它们正在使用CPU核心.我认为如果CPU核心是免费的,那么它使用CPU核心否则它使用GPU. 解决方案 有三种方法可以做的表面成分: 使用"覆盖"平面.大多数最近的设备将在最多四个平面上组成,因为像素被发送到显示器.这是(通常)表面组成的最有效的方法. DRM视频是必需的,因为目前没有办法掌握"安全"表面. 在GPU上的使用OpenGL ES.如果您有四个以上的计划,SurfaceFlinger将返回到此处.它也用于虚拟显示器和像screenrecord这样的东西.在某些设备上,如果没有在一下更新曲面,则硬件作曲家将使用GPU构成曲面,然后只显示单个缓冲区.如果没有任何改变). 在CPU上的.没有人再这样做了. 设备之间究竟在设备之间变化,并
我正在尝试更好地了解Android显示子系统,但是一个仍然令我困惑的一个项目是如何处理VSync信号,以及为什么首先存在这么多. Android旨在在其核心使用vsync,但有多个VSync信号它采用.通过 https://source.android.com/devics/graphics/implement.html 在"vsync中偏移"部分,有一个流程图,该流程图是三个vsync信号:hw_vsync_0,vsync和sf-vsync.我知道HW_VSYNC用于更新DISPSYNC中的时序,并且应用程序和STEREFLINGER使用VSYNC和SF-VSYNC,但为什么所有必要的信号都是必要的?此外,偏移如何影响这些信号?是否有一个可用的时间图,更好地解释了这个? 感谢您可以提供的任何帮助. 要了解此内容,最好从系统级图形架构文档,特别注意需要三重缓冲部分和相关图(其理想情况下是一个动画GIF).开始的句子,"如果应用程序开始在vsync信号之间的中间渲染",则"专
如何在Android上开始表面浮标之前绘制一些东西? 在这种情况下,它是一种带有Framebuffer设备的传统Linux,因此直接访问Framebuffer应该可以. 如何直接使用HWCOMPOSER,如何直接使用EGL? 解决方案 如果SurfaceFlinger未运行,您只需打开Framebuffer设备并写入它(假设您使用 具有framebuffer设备的设备). 有关此的示例,请参见"恢复" UI的实现.那里的密钥文件有使用OpenGL ES/EGL会更棘手.一些早期的GLES测试,例如 更新:即将发布的版本发生,您可以看到FrameBufferWindow(" WindowsUrface")的替代品在这里. 如果SurfaceFlinger未运行,您可以使用内部接口.有一些
是否有关于 adb 命令“dumpsys SurfaceFlinger"输出的文档? 特别是,我想了解 HWC 或 GLES 图层类型之间的区别是什么,numHwLayers 是什么意思? 这是我正在谈论的 dumpsys SurfaceFlinger 部分: mDebugForceFakeVSync=0 Display[0] : 768x1280, xdpi=319.790009, ydpi=318.744995, refresh=16666667 numHwLayers=5, flags=00000000 type | handle | hints | flags | tr | blend | format | source crop | frame name ------------+----------+----------+----------+---
在调查游戏时,我发现从游戏和postframebuffer()中的Bewteen eglswapbuffer()在SurfaceFlinger中,总是延迟"SurfaceView"持续0.5ms到10ms,似乎相当随机,无关紧要CPU负载.这真的代表了什么?与VSYNC的显示点有什么关系吗? http://i.stack.imgur.com/n8mvg.png 解决方案 该行表示缓冲区.元素的高度(迹线的可见部分中的0或1)表示队列中存在多少缓冲区. 在这种情况下,它是在SurfaceView曲面上呈现的图形缓冲区的队列.当您的App调用eglSwapBuffers()时,它将缓冲区提交给队列.当SurfaceFlinger在VSync信号上唤醒时,如果可用,则锁存从队列中的缓冲区,并将其复合用于下一个刷新. 更新: bufferqueues和它们的用途在一些细节中介绍在这里.附录C提到它们在Systrace中的外观.
我正在运行一个使用 ScreenshotClient 循环捕获屏幕的本机进程.随机运行几次后,当我关闭进程时,我得到“服务'SurfaceFlinger'死亡"并且屏幕重新启动.这在 android 4.2 中不会发生. 这是回溯: I/DEBUG ( 111): backtrace: I/DEBUG ( 111): #00 pc 0002a61e /system/lib/libgui.so I/DEBUG ( 111): #01 pc 0002f205 /system/lib/libgui.so (android::Surface::queueBuffer(ANativeWindowBuffer*, int)+220) I/DEBUG ( 111): #02 pc 0002e2cd /system/lib/libgui.so (android::Surface::hook_queueBuffer(ANativeWind