0

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

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

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

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

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

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

4

2 回答 2

0

I use OpenGL for some visualization in a released app, and I have an uncaught exception handler in place to catch any exception coming from the GLThread and disable OpenGL the next time the app is run, since I had some crash reports in the internals of GLSurfaceView.java coming in from buggier devices. If the 3D rendering is not crucial to your app, this is one approach you can take so that users with these devices can continue to use the app.

From Android 3.0+ you can also preserve the EGL context by calling GLSurfaceView. setPreserveEGLContextOnPause(true);. You'll only really need to do this if your renderer is very expensive to initialize, and it only works if you're not destroying the GLSurfaceView in between (i.e. the default behavior of an activity when rotating the device). If you're not loading that many resources then initializing OpenGL is usually fast enough.

于 2013-02-22T02:35:09.987 回答
0

SurfaceView文档(强调我的):

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

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

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

于 2013-02-22T03:45:28.427 回答