问题标签 [surfaceflinger]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
2446 浏览

android - Android 动画:跟上 vsync

免费

我正在为尚未定义的硬件平台(目前正在测试 Ouya 和 MK802IV,所有 Android 4.1+)开发一个基于 Android 的应用程序,其中涉及将各种内容显示到 1080p@60HZ 输出(大屏幕)。

该应用程序涉及显示滚动条,即在屏幕上从右到左滚动的一段文本(如在电视新闻台上看到的那样)。我确实有一个工作实现(扩展 SurfaceView 和手动绘图),可以在 60fps 下完美运行。

问题

当应用程序的其余部分开始执行更高级的片段动画并且滚动的帧率下降时。对我来说,这种下降是完全正常的(即使在优化之后),但是即使帧速率下降到 30-40fps,我也希望滚动保持其原始速度和平滑度。这非常重要,因为移动文本的平滑度对用户来说非常明显。

我已经阅读了有关 Android 4.1+ 中使用的 Vsync 和 tipple 缓冲的信息,据我所知,有两种可行的解决方案:

解决方案 1:较慢的 VSYNC

对于整个应用程序或设备,将 Vsync 全局降低到 ~30fps 会很棒。不幸的是 eglSwapInterval 不适用于任何经过测试的设备。

  • 有没有办法强制整个应用程序/设备以恒定的较低帧速率呈现?

解决方案 2:知道我在渲染什么帧

由于设备具有 Android 4.1+,我的 SurfaceView 被渲染为三重缓冲方案的一部分,现在如果我的实现以某种方式知道它正在渲染什么帧,它可以相应地绘制滚动文本,尤其是子像素绘制不是问题。

我尝试过使用 SystemClock.uptimeMillis 的简单实现,但是以这种方式获得的时间戳波动太大(即使在 60fps 时,帧之间的时间增量也远非恒定)。

  • 有没有办法知道我正在渲染哪一帧或跳过了多少帧,所以我可以使用这些信息来正确渲染帧?

  • 对于如何处理文本滚动的主题,您还有其他建议吗?

附加信息

请记住,文本可能很长(1000 个字符+),以~20 个字符/屏幕显示,~4 像素/秒到 1920x280px 小部件,字体不是等宽的。我曾想过使用 OpenGL 和 GlSurfaceView,但是这里的问题仍然存在,在高系统负载期间,我仍然需要知道,我目前正在渲染什么。

依赖于平台的解决方案也非常受欢迎,因为我将控制可以支持的平台(可能是一个非常狭窄且不是主流的范围)。

预先感谢您的帮助。

0 投票
1 回答
324 浏览

android - 读取android-layer的内容

我正在从事一个项目,该项目涉及读取要由 Surfaceflinger 合成的图层的内容。

我特别需要检查要合成的层是否全为1位0r全为0位。

这是为了在 SurfaceFlinger 合成之前应用一些优化。

我通过adb-logcat跟踪缓冲区的创建(通过添加我自己的日志消息),但找不到读取层实际内容的方法。

谁能告诉我这是否可能,如果是,怎么做?

0 投票
1 回答
6426 浏览

android - 在 Android-surfaceflinger 中访问图层内容

我正在阅读图层内容以检查其内容是否与应用程序在屏幕上呈现的内容相同。我正在阅读内容,然后再由SurfaceFlinger合成它们。这是HWCLayerVersion1 :: setAcquireFenceFd () 在HWComposer.cpp中的代码块,用于将图层内容/像素转储到原始文件。

当我使用具有适当属性的IrfanView读取像素时,图像仅与实际内容略有相似,但颜色都被弄脏了。这背后的原因是什么?在我阅读内容时是否正在渲染缓冲区?我对 AOSP 完全陌生,任何帮助将不胜感激。

0 投票
1 回答
1798 浏览

android - dumpsys SurfaceFlinger 输出中的源裁剪和帧值

我正在做一个关于 SurfaceFlinger 的项目。那么,什么时候“源裁剪”区域与“框架”区域不同(这些是出现在 dumpsys SurfaceFlinger 输出中的值)。换句话说,何时/为什么要缩放图层内容(由应用程序渲染)。或者它们是在缩放后由应用程序本身呈现的。如果不是,SurfaceFlinger 是否获取图层内容、缩放它们然后合成它们?此外,谁来决定“框架”矩形、应用程序还是 SurfaceFlinger?

0 投票
2 回答
351 浏览

android - Surfaceflinger 通知

在 android 显示过程中,SurfaceFlinger 在这种情况下发挥了重要作用。

顺便问一下,有什么方法可以注意到 SurfaceFlinger 在应用程序级别启动或停止?

或者任何其他需要观察的显示过程?

我想知道触摸和显示之间的时间差。

0 投票
1 回答
2188 浏览

android - 使用 OpenGL ES 2.0 在 Android 中进行双缓冲页面翻转

从 Froyo 及更高版本开始,我可以安全地接近 Android 设备的图形硬件吗?

我想在 Android 设备上实现一个简单的页面翻转方案,使用两个帧缓冲区。

它应该是这样的:

  1. 渲染到帧缓冲区 A。(帧缓冲区 A 是后台缓冲区,当前显示帧缓冲区 B。)

  2. 等待下一个 VSYNC(可能是 VSYNC 中断?)

  3. 告诉操作系统显示帧缓冲区 A 并使帧缓冲区 B 成为后台缓冲区。

  4. 渲染到帧缓冲区 B。(帧缓冲区 B 是后台缓冲区,当前显示帧缓冲区 A。)

  5. 等待下一个 VSYNC(可能是 VSYNC 中断?)

  6. 告诉操作系统显示帧缓冲区 B 并使帧缓冲区 A 成为后台缓冲区。

重复步骤 1 - 6。

每秒更新大约 15 到 25 次显示器最适合我的需要。(我永远不需要 60 fps 或任何高于 30 fps 的速度。)

我打算只使用 OpenGL ES 2.0 进行所有渲染。

0 投票
1 回答
1841 浏览

android - 是否可以绕过Android的surfaceflinger?

我最近问了一个相关的问题,但我忘了明确地问这个问题。

(我想在使用 OpenGL ES 2.0 的 Android 应用程序中实现双缓冲方案,而 Android 的默认方案似乎有点难以预测。)

0 投票
0 回答
2041 浏览

android - Android 原生代码:将 Surface 分配给特定显示器

我正在寻找一种将 Surface(本机窗口)对象分配给显示器的方法,以便提交给该本机窗口的缓冲区将呈现到该特定显示器而不是主显示器。我想在本机代码中做到这一点。

在 Java 中,可以使用 Presentation API 来完成。

在本机代码中,我尝试调用SurfaceComposerClient::setDisplaySurface(),将显示IBinder对象(由 返回SurfaceComposerClient::getBuiltInDisplay())和IGraphicBufferProducer对象(由返回)传递给它Surface::getIGraphicBufferProducer()。问题是显示变为空白,即使我将缓冲区提交到本机窗口,也没有显示任何内容。

如果我不调用SurfaceComposerClient::setDisplaySurface(),则本机窗口将呈现到主显示器。

示例代码:

有谁知道这是否可以在本机代码中完成,如果可以,如何?

谢谢

0 投票
0 回答
360 浏览

android - 通过GDB查看surfaceflinger中使用了哪个显示器

我有一个 surfaceflinger 核心转储,我正在寻找帧缓冲区损坏。我在带有 IMX6 的飞思卡尔板上运行 android JB 4.3 并有两个显示器,一个内部 LVDS 和另一个外部显示器(通过 HDMI 连接)

我试图弄清楚哪个显示器与核心相关联 - 我正在查看的损坏的帧缓冲区是连接到内部显示器还是连接到外部显示器。

在 gdb 中,我运行以下命令:

(gdb) f 0x4014e6a0 in android::SurfaceFlinger::doComposition (this=0x406f1008) at frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:1031 1031 postFramebuffer(); (gdb) (gdb) p mDisplays.mVector $15 = (android::SortedVector, android::sp > >) { = { = { _vptr.VectorImpl = 0x4015a6e0, mStorage = 0x4099efa8, mCount = 2, mFlags = 0, mItemSize = 12 }, }, } (gdb)

有没有办法在 gdb 中查看 VectorImpl 元素?我如何知道核心堆栈框架中当前使用的是哪个元素?

我很感激你的建议。

0 投票
1 回答
472 浏览

android - 在显示之前将过滤器应用于帧缓冲区

我想对 Android 设备屏幕上显示的任何内容应用某种图像过滤器。图像过滤器的最简单示例可能是在帧缓冲区显示在屏幕上之前应用到帧缓冲区的棕褐色过滤器。只是为了确保,我希望这种效果系统范围广泛,而不仅仅是在我的应用程序中。