【问题标题】:Android ICS: What does the system "Force GPU Rendering" option actually do?Android ICS:系统“强制 GPU 渲染”选项实际上有什么作用?
【发布时间】:2013-03-01 21:23:21
【问题描述】:

我发现当我启用此开发人员选项时,我的 OpenGL 项目停止工作。至少可以说有点令人震惊。

Logcat 显示了其中的无数个:

 E/libEGL  ( 1022): called unimplemented OpenGL ES API
 E/libEGL  ( 1022): called unimplemented OpenGL ES API
 E/libEGL  ( 1022): called unimplemented OpenGL ES API
 ...

第一个场景渲染得非常好,但是在第一个 swapbuffers() 之后,所有后续的 GL ES API(甚至 glSetMatrixMode())除了记录“未实现的 API”之外什么都不做。

如果我将“强制 GPU 渲染”选项关闭关闭,这一切都运行良好(即已实现)。

那么,这个选项实际上有什么作用?

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    该选项适用于开发人员,以便他们可以在启用硬件加速的情况下轻松测试他们的应用。据我了解,使用 Canvas API 的 2D 应用程序可以从此选项中受益,因为打开此选项确实会强制系统在不同的线程上创建本机 GLES2.0 上下文并让 Canvas 类使用 GLES h/w 加速后端而不是 Skia 一个。这种原生 GLES2.0 上下文创建发生在 C 原生代码中,应用程序开发人员无法对此进行控制。

    回到您的问题,“称为未实现的错误消息”基本上是说(1)您确实使用了错误的 GL 上下文(例如,使用 GLES2.0 上下文进行 GLES1.1 调用,反之亦然) 或 (2) 您的设备无法加载 GLES 驱动程序,因此系统无法找到实际的 GL 函数指针。系统通过读取 /system/lib/egl/ 下的 egl.cfg 文件知道要加载什么,而 GL 驱动程序本身位于 /system/vendor/lib/ 下。

    我会跟进 Google,因为这可能只是一个错误。

    【讨论】:

    • 这对我来说已经足够接近了,并且符合观察和我在其他地方学到的东西。我从 Android 图形专家 Romain Guy 那里收到了一条推文……他说 OpenGL 应用程序只有在主 UI 线程上创建 EGL 上下文时才会出现这个问题。所有 GL 调用都在专用线程上运行更为常见,我不喜欢这种做法,因为太无聊而无法深入探讨。
    • @ReubenScratton 我在这里遇到了完全相同的问题,并且我还在主线程上创建了 EGL 上下文。你有没有找到解决方案,或者你最终为 GL 使用了一个单独的线程?
    • 我最终创建了一个专用的渲染线程并将所有 GL 代码移入其中。这对我的需求和你的需求来说是多余的,但是这个特定的操作系统功能假设所有 GL 应用程序都在主线程上呈现,我们必须遵守这一点。
    【解决方案2】:

    它强制在所有应用程序中进行硬件加速。你可以在这里阅读更多信息:http://developer.android.com/guide/topics/graphics/hardware-accel.html

    确保检查不支持的操作,这可能是您遇到问题的地方。

    【讨论】:

    • 感谢您的链接,但我的用户界面完全是 OpenGL ES...它已经加速了。我不使用任何 Canvas API,也不明白为什么此设置会影响基于 GL 的应用程序。看起来此设置会导致加载替代 GL 驱动程序。
    • 有趣的是,如果它正在加载另一个驱动程序来为画布 API 进行硬件加速,我不会感到惊讶。 (我几乎 100% 肯定这是你在强迫的)为了测试我的理论,你可以在你的应用程序清单中启用 hw acc,并且 sdk 目标至少为 3.0。相关说明在组织答案的链接中。
    【解决方案3】:

    ICS 中的加速模式并不比 Honeycomd 中的更特殊。默认情况下,所有面向 api 14 或更高版本的应用程序都启用加速模式。但同时,也有针对其他版本 SDK 的应用程序。因此,您可以通过设置“强制 GPU 渲染”在这些应用程序中启用硬件加速。来自 Dianne 的 explanationpost 很好地解释了这一点。

    【讨论】:

    • 这确实是来自 hackbod 的一篇好帖子,但不幸的是对我没有多大帮助。我越来越认为这是 ICS 中的一个错误。最新观察是,在第一帧绘制(成功)之后,我的 EGLImpl.mEGLContext 发生了变化。很确定这不应该发生。
    • 尝试在 android-platform google 群组中提出这个特定问题。 groups.google.com/forum/#!forum/android-platform我也在这里找到了这个错误的一个很好的解释:stackoverflow.com/questions/5926316/…
    • 我可能会这样做,我仍在调查中。看起来操作系统正在强制应用程序切换到 2.0 渲染器,这就是 glMatrixMode 等 API 突然不受支持的原因。尽管清单声明只使用了 1.1。如果这个观察是正确的,那么史诗般的 ICS 就会失败......
    • 我有一个类似的问题,我有一个完全 opengl 活动,如果我设置 targetSdkVersion=15 如果我设置它 targetSdkVersion
    【解决方案4】:

    正如这里所说,该选项强制图形硬件加速,它应该是 API 级别 14 或 15 的默认设置,我的意思是 ICS。

    我不建议在模拟器上进行测试,因为它会使您的计算机和 Eclipse 变得迟缓和/或崩溃。我已经在具有 API 级别 14 和 15 的各种资源配置(显示器、缓存、CPU 和 RAM 的大小不同)的模拟器上尝试了此设置,并且它总是崩溃

    最好在双核设备上测试您的应用程序,例如最近的三星 Galaxy 10.1、8.9 平板电脑或摩托罗拉 Xoom 平板电脑,这些设备具有 nVidia Tegra GPU 等实际硬件来支持自 Honeycomb 以来的加速,使其更适合 OpenGL ES 应用程序...由于市场上没有带有 ICS 的平板电脑,但您将无法匹配 API 级别 14 和 ICS 的上述配置。

    最后我同意 Google 尚未解决/解决 SDK 上的一个错误。

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2016-11-09
      • 1970-01-01
      • 2012-01-26
      • 2012-03-31
      • 2018-06-05
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多