是否有任何权衡将一些OpenGL添加到“严肃”(非游戏)的Android应用程序中?
我想使用OpenGL的原因是为一些视图添加了一些3d行为。
根据此http://developer.android.com/guide/topics/graphics/opengl.html OpenGL 1.0在每个Android设备中都可用,并且不需要修改清单文件。所以永远不会出现兼容性问题。
我能想到的唯一两件事是1.其他不能使用OpenGL的开发人员的可持续性。可能2.与其他组件的集成问题/不能很好地重用(但不确定)。
还有其他什么,意想不到的事情,某种开销,并发症等等吗?
要求,因为它似乎不是一种非常流行的做法,人们似乎更喜欢用2d“伪造”3D或放弃它。不知道是不是因为他们不想学习OpenGL。
答案 0 :(得分:0)
我在已发布的应用程序中使用OpenGL进行一些可视化,并且我有一个未捕获的异常处理程序来捕获来自GLThread的任何异常并在下次运行应用程序时禁用OpenGL,因为我在其中有一些崩溃报告来自buggier设备的GLSurfaceView.java的内部结构。如果3D渲染对您的应用程序并不重要,那么您可以采用这种方法,以便拥有这些设备的用户可以继续使用该应用程序。
在Android 3.0+中,您还可以通过调用GLSurfaceView来保留EGL上下文。 setPreserveEGLContextOnPause(真);.如果您的渲染器初始化非常昂贵,那么您才真正需要这样做,并且只有在您不破坏其间的GLSurfaceView时(即旋转设备时活动的默认行为),它才有效。如果你没有加载那么多资源,那么初始化OpenGL通常足够快。
答案 1 :(得分:0)
来自SurfaceView文档(强调我的):
表面是Z有序的,因此它位于保持SurfaceView的窗口后面; SurfaceView在其窗口中打孔以允许其表面显示。视图层次结构将负责正确地与Surface合成任何通常出现在它上面的SurfaceView的兄弟。这可用于在表面顶部放置叠加(如按钮),但请注意,它会对性能产生影响,因为每次Surface更改时都会执行完整的Alpha混合合成。
优点是您的GL线程可以独立于UI线程更新屏幕(即,它不需要渲染到纹理并将纹理渲染到屏幕);缺点是某些东西需要将您的视图与屏幕合成。如果你很幸运,这可以在“硬件作曲家”中完成;否则它在GPU上完成,可能有点浪费GPU资源(参见 For Butter或Worse:在Android UI中平滑性能 27:32和40:23)。
如果您的观点很小,最好使用TextureView。这将呈现为纹理并将纹理呈现为普通视图层次结构的一部分,这可能更好,但可能会增加延迟。缺点是它仅在API级别14之后可用。