首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android上正确初始化和终止EGL

如何在Android上正确初始化和终止EGL
EN

Stack Overflow用户
提问于 2011-06-15 22:52:12
回答 1查看 12.7K关注 0票数 15

虽然有很多关于在Android上使用OpenGL ES的例子,但在初始化/终止EGL方面,它们似乎都是不正确的(甚至是Android /NDK附带的示例)。问题的根源就在于Android的应用模型,这使得EGL的正确使用变得怪异。

当所有的示例,甚至GLSurfaceView (实际上大多数示例都只是使用它)时,EGL根据操作系统的组件 (Activity或WallpaperService)初始化/终止EGL的真正问题。这是完全错误的,因为所有组件都在同一个进程中运行!如果应用程序只包含一个组件,那么没有问题,但是如果应用程序中有多个组件,并且每个组件都在使用OpenGL ES,这将是一个问题。

只需考虑使用OpenGL ES的两个应用程序组件同时运行而其中一个组件完成时的情况。在完成这些组件后,将调用eglTerminate() (查看GLSurfaceView源代码以了解我在说什么),这将终止整个进程的EGL!从现在开始,来自另一个已经在运行的组件的任何EGL调用都将失败!

我已经检查了大量示例,它们都是基于每个组件初始化和终止EGL的(实际上,我见过的任何人都没有做过与GLSurfaceView不同的事情,其中大多数只是复制了GLSurfaceView内部组件)。

现在我感兴趣的是找到一种在Android上使用EGL的“适当”方法(关于初始化/终止)。

“适当”方式应规定:

当使用EGL的第一个组件启动时,当使用EGL的最后一个组件为finished

  • Multithreading.时,
  1. EGL终止不应仅从主应用程序线程限制EGL操作。

请注意,(2)对于在没有使用EGL/OpenGL ES的活动实体时,通过应用程序最小化系统资源的使用是必不可少的。

有什么想法吗?或者我忽略了Android上EGL的一些东西?

更新

还有一个令人感兴趣的相关问题:

由于每个线程只允许一个活动呈现上下文,通常只有一个组件可以使用主线程的OpenGL ES。在主线程中同时运行多个使用eglMakeCurrent() ES的组件将导致问题,因为最后调用OpenGL的组件将隐式地用自己的上下文“替代”所有其他组件的上下文(这实际上将完全破坏组件逻辑)。

更新2(最后)

据透露(感谢eglInitialize() Romain Guy),Android实际上有一个内部解决方法来解决EGL初始化/终止问题,其形式是显式的(它违背EGL规范,而不是在Android文档中提到)在eglTerminate().和中“引用计数”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-17 07:36:53

eglTerminate()和eglInitialize()是引用计数,所以每个“组件”都可以调用它们。特别是在Android3.0上,在同一个应用程序中有几个OpenGL上下文是很常见的,而且EGL也没有任何问题。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6365366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档