我想问一下SurfaceFlinger是否总是被调用到屏幕上的任何类型的绘图?例如,在屏幕上显示JPG文件.
是否有Surface,SurfaceHolder,EGLSurface,SurfaceView,GLSurfaceView,SurfaceTexture和TextureView的详细说明?特别是:
android surfaceview glsurfaceview surfaceflinger textureview
我正在努力更好地理解Android显示子系统,但是仍然让我感到困惑的一个问题是如何处理VSYNC信号,以及为什么这么多存在于第一位.
Android的核心是使用VSYNC,但它采用了多种VSYNC信号.通过"VSYNC偏移"部分中的https://source.android.com/devices/graphics/implement.html,可以看到三个VSYNC信号的流程图:HW_VSYNC_0,VSYNC和SF-VSYNC.我知道HW_VSYNC用于更新DispSync中的时序,并且应用程序和surfaceflinger使用VSYNC和SF-VSYNC,但为什么这些单独的信号是必需的?此外,偏移如何影响这些信号?是否有可用的时序图更好地解释了这一点?
谢谢你尽你所能的帮助.
android vsync surfaceflinger android-4.4-kitkat android-5.0-lollipop
我的应用程序每帧更改一些非常简单的视图(旋转,平移)的属性.根据Android性能文章的建议,我使用了systrace来检查我是否丢帧.
出乎意料的事情出现了.当设备静止不动时(即使我触摸屏幕)CPU使用率更高,systrace上的警报出现,GPU渲染分析器的红色部分更长.当我快速旋转或震动设备时,一切都很好.
以下是结果的链接.Shake
是我快速旋转设备的no_shake
时候,就是把它放在我的桌子上.
我制作了一个非常简单的测试应用程序,它使用单个翻译动画:源代码.
看一下帧速率平滑的shake systrace,为什么HW_VSYNC_0和HW_VSYNC_ON_0行没有数据?如何读取CPU频率(我在捕获跟踪时启用了该选项).
关于这个问题,我的理论是该设备可能会降低CPU频率.我怎么能在systrace中读到这个?我使用第三方应用来测试这个假设,如下所示.那么,我该怎么做才能避免这个问题呢?
为什么设备会这样做?起初,我认为设备使用加速度计数据来了解它是否未被使用,然后降低了CPU频率.但是,为了增加CPU频率,我必须非常努力地摇动设备.像普通人一样握住它不会增加CPU频率.
我知道这是很多问题,但是在阅读了有关Android图形管道的所有相关文章之后,我的想法就出错了.
在运行Android 5.1的Sony Xperia Z3上出现此问题.运行Android 6的Nexus 5无法重现此问题.
更新
似乎性能问题是由CPU/GPU限制引起的.同样的设备,Xperia Z3,在运行Android 4.4时,即使它降低了时钟速度,它根据Systrace表现更好.此外,摇动时不会提高速度.
关于提高CPU速度所需的摇动手势,我注意到当我尝试将设备从纵向旋转到横向或反之亦然时,CPU时钟会在触发时增加(即使应用程序没有改变方向).因此,我认为监控此手势的原因是为了加快可能的方向变化.
我正在使用 Unity 开发一款 2D 移动游戏。我在仅运行 Android 12 的设备上收到以下错误。该项目的目标 API 31。以前的 Android 版本不会出现此错误。
2022-09-02 12:33:40.847 647-647/? E/TimeStats: [1572]-[SurfaceView[com.abc.ProjectName/com.unity3d.player.UnityPlayerActivity](BLAST)#0]-timeRecords is at its maximum size[64]. Ignore this when unittesting.
这些行充斥着 logcat。游戏正在运行,但错误不断出现。我找到了错误的来源:Here
我不明白是什么导致了这个错误,也不知道如何修复它。任何帮助,将不胜感激。
我有这个错误消息:
SurfaceFlinger半透明= 0 isOpaque = 1 isExternalDisplayLayer = 0 isExternalBlockLayer0
我正在使用android 4.1.1
我无法说出我的代码的哪一部分正在生成此消息
我想知道是否有人有相同的信息,这意味着可能解决这个问题的方法
问题.
谢谢
是否有关于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
------------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------
GLES | b7e1c440 | 00000002 | 00000000 | 00 | 00100 | 00000002 | [ 334, 56, 1102, 1190] | [ 0, 50, 768, 1184] com.android.systemui.ImageWallpaper
GLES | b7e1d7c8 | 00000002 | 00000000 | 00 | 00105 | 00000001 | [ 0, 50, 768, 1184] | …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种将 Surface(本机窗口)对象分配给显示器的方法,以便提交到该本机窗口的缓冲区将呈现到该特定显示器而不是主显示器。我想在本机代码中做到这一点。
在 Java 中,可以通过使用 Presentation API 来完成。
在本机代码中,我尝试调用SurfaceComposerClient::setDisplaySurface()
,将显示IBinder
对象(由 返回SurfaceComposerClient::getBuiltInDisplay()
)和IGraphicBufferProducer
对象(由返回)传递给它Surface::getIGraphicBufferProducer()
。问题是显示变为空白,即使我将缓冲区提交到本机窗口,也没有显示任何内容。
如果我不调用SurfaceComposerClient::setDisplaySurface()
,则本机窗口将呈现到主显示器。
示例代码:
sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(1));
SurfaceComposerClient::getDisplayInfo(display, &displayInfo);
surfaceControl = surfaceComposerClient->createSurface(String8(""), displayInfo.w, displayInfo.h, HAL_PIXEL_FORMAT_RGB_565);
sp<Surface> surface = surfaceControl->getSurface();
sp<IGraphicBufferProducer> iGraphicBufferProducer = surface->getIGraphicBufferProducer();
SurfaceComposerClient::setDisplaySurface(display, iGraphicBufferProducer);
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可以在本机代码中完成,如果可以,如何实现?
谢谢
我们正在定制Android x86 Nougat(Android v7.1)项目的分支.由于我们的系统中没有视频显示硬件,因此我们尝试设置虚拟帧缓冲区(VFB),以便我们可以自定义方式处理视频显示(例如,通过VNC服务器路由视频显示等).
我们在系统启动时SurfaceError尝试初始化它时尝试使用gralloc分配内存时失败.以下是logcat的摘录:
03-02 18:31:21.757 986 986 E gralloc : #### gralloc_alloc
03-02 18:31:21.757 986 986 E gralloc : #### gralloc_alloc_framebuffer
03-02 18:31:21.757 986 986 E gralloc : #### gralloc_alloc_framebuffer_locked
03-02 18:31:21.757 986 986 E Gralloc1On0Adapter: gralloc0 allocation failed: -12 (Out of memory)
03-02 18:31:21.757 986 986 E GraphicBufferAllocator: Failed to allocate (360 x 480) format 5 usage 6656: 5
03-02 18:31:21.757 986 986 V Gralloc1On0Adapter: Destroying descriptor 3
03-02 18:31:21.757 986 986 V Gralloc1On0Adapter: dump(0 (0xbfe341f4), 0x0 …
Run Code Online (Sandbox Code Playgroud) android linux-kernel android-source android-x86 surfaceflinger
我正在调查Android应用中的帧丢失.它们是不规则的,平均每秒发生一次.我已将有问题的渲染器与一个非常简单的着色器配对,我相信帧渲染时间很短.
当我运行systrace时,我可以看到看起来像丢帧的情况,但原因似乎是HW_VSYNC_0信号偶尔无法翻转(即它在0或1处停留半个周期).我的理解(从这个答案)是这个时钟来自显示硬件,因此应该是常规的.
VSYNC-sf信号无论如何都会继续运行,尽管它偶尔会翻转,大概是在拼命想要恢复同步.
我的问题:这是预期的行为以及导致它发生的原因吗?
android ×10
surfaceflinger ×10
vsync ×3
surfaceview ×2
adb ×1
android-x86 ×1
graphics ×1
linux-kernel ×1
native ×1
systrace ×1
textureview ×1