【问题标题】:Is it possible to bypass Android's surfaceflinger?是否可以绕过Android的surfaceflinger?
【发布时间】:2014-08-16 19:53:10
【问题描述】:

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

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

【问题讨论】:

    标签: android opengl-es framebuffer surfaceflinger


    【解决方案1】:

    绕过 SurfaceFlinger 的唯一方法是 root 设备并关闭整个应用程序框架。然后,您必须与硬件作曲家 HAL 交互 - 仅使用帧缓冲区 dev 无法在所有设备上工作。

    SurfaceFlinger's behavior 是非常可预测的,只要没有发生任何其他事情。当然,总会有其他事情发生,但无论您是否通过 SurfaceFlinger 合成都是如此。

    正如在另一个问题(可能是您的问题)中提到的,Android 上的 GLES 至少是双缓冲的 (eglSwapBuffers()),因此您无需实现任何东西来获得该行为。

    【讨论】:

    • 是的,Fadden 先生,您当时回答了我的另一个问题让我很满意,但我注意到即使我的测试程序中的每个渲染过程都很短(不能接近 1/ 60 秒),我偶尔会注意到口吃。另外,如果我没记错的话,您在一篇技术文章中写道,surfaceflinger 的行为可能会在未来的 Android 中发生变化。是否保证会保留双缓冲?
    • 分析 jankiness 的最佳工具是 systrace(例如 developer.android.com/tools/debugging/systrace.html )。通过更改渲染循环可以避免明显的卡顿;见source.android.com/devices/graphics/architecture.html#loops。双重(或三重)缓冲对于避免撕裂是必要的,因此它不会消失。
    • 您好,法登先生。我正在自己构建Android系统,我想知道如何关闭整个应用程序框架?
    • @DreamInBox:adb shell stop。 FWIW,您应该为此类问题创建一个新问题,而不是对现有答案添加评论。
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多