【问题标题】:Disadvantages of using OpenGL in Android app?在 Android 应用程序中使用 OpenGL 的缺点?
【发布时间】:2012-12-20 20:24:11
【问题描述】:

在“严肃”(非游戏)Android 应用程序中添加一些 OpenGL 是否有任何权衡?

我想使用 OpenGL 的原因是为一些视图添加一些 3d 行为。

据此http://developer.android.com/guide/topics/graphics/opengl.html OpenGL 1.0 可用于所有 Android 设备,并且不需要修改清单文件。所以永远不会有兼容性问题。

我能想到的唯一两件事是 1. 其他无法使用 OpenGL 的开发人员的可维护性。并且可能 2. 与其他组件的集成问题/不能很好地重用(虽然,不确定)。

还有其他什么,意想不到的事情,某种开销,并发症等吗?

因为这似乎不是一种非常流行的做法而询问,人们似乎更喜欢用 2d 来“伪造”3d 或放弃它。不知道是不是因为他们不想学OpenGL。

【问题讨论】:

  • 如果您打算支持标准的应用程序工作流程,那么使用 opengl 来管理多个屏幕会变得很困难。在最新的设备中,支持硬件加速,可以在可能的情况下将工作推送到 gpu。运行 opengl 所需的启动/拆卸使得切换上下文/活动对最终用户来说非常痛苦。
  • 您指的是哪个启动/拆卸?
  • 好吧,在您的情况下,向自定义视图添加一些 3d 特定功能可能不会增加显着的开销,但在一个体面的游戏中,设置 glcontext 并将资产加载到内存中需要一些时间。此上下文在暂停时丢失,需要在恢复时重新创建,这会导致一些滞后。这真的取决于你想要完成什么。
  • 所以你的意思是位图被加载到与普通内存不同的内存中,这需要更多时间?否则,这将适用于所有类型的游戏/图形密集型应用程序。那么设置 glcontext 需要很多时间呢?
  • 就像你说的那样,这可能不适用于我,因为不是非常图形或动画密集。但我很好奇。

标签: android opengl-es


【解决方案1】:

我在已发布的应用程序中使用 OpenGL 进行一些可视化,并且我有一个未捕获的异常处理程序来捕获来自 GLThread 的任何异常并在下次运行应用程序时禁用 OpenGL,因为我在来自错误设备的 GLSurfaceView.java 的内部结构。如果 3D 渲染对您的应用来说并不重要,这是您可以采取的一种方法,以便使用这些设备的用户可以继续使用该应用。

从 Android 3.0+ 开始,您还可以通过调用 GLSurfaceView 来保留 EGL 上下文。 setPreserveEGLContextOnPause(true);。如果您的渲染器的初始化成本非常高,您才真正需要这样做,并且它仅在您不破坏其间的 GLSurfaceView 时才有效(即旋转设备时活动的默认行为)。如果你没有加载那么多资源,那么初始化 OpenGL 通常就足够快了。

【讨论】:

    【解决方案2】:

    来自SurfaceView 文档(重点是我的):

    表面是 Z 顺序的,因此它位于持有其 SurfaceView 的窗口后面; SurfaceView 在其窗口中打了一个洞,以显示其表面。视图层次结构将负责正确地将 SurfaceView 的任何兄弟姐妹与 Surface 合成,这些兄弟通常会出现在它的顶部。这可用于在 Surface 顶部放置按钮等叠加层,但请注意,它可能会对性能产生影响,因为每次 Surface 更改时都会执行完整的 alpha 混合合成。

    优点是您的 GL 线程可以独立于 UI 线程更新屏幕(即它不需要渲染到纹理并将纹理渲染到屏幕);缺点是 something 需要将您的视图与屏幕合成。如果幸运的话,这可以在“硬件作曲家”中完成;否则它是在 GPU 上完成的,可能有点浪费 GPU 资源(请参阅 For Butter or Worse: Smoothing Out Performance in Android UIs at 27:3240:23)。

    如果您的视图很小,最好使用TextureView。这将渲染到纹理并将纹理渲染为正常视图层次结构的一部分,这可能会更好,但会增加延迟。缺点是它仅从 API 级别 14 开始可用。

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2011-03-10
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多