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

2024-03-26

虽然有很多关于在 Android 上使用 OpenGL ES 的示例,但所有这些示例在 EGL 的初始化/终止方面似乎都是不正确的(即使是 Android SDK/NDK 附带的示例)。问题的根源在于 Android 应用程序模型,这使得 EGL 的正确使用变得很奇怪。

EGL 根据操作系统初始化的真正问题process而所有 Android 示例甚至GL表面视图(实际上大多数示例只是使用它)涉及 EGL 初始化/终止成分(活动或壁纸服务)。这是完全错误的,因为所有组件都在同一个进程中运行!如果应用程序仅由一个组件组成,那么没有问题,但如果应用程序中有多个组件并且每个组件都使用 OpenGL ES,则这就出现问题了。

考虑一下这样的情况:两个使用 OpenGL ES 的应用程序组件同时运行并且其中一个组件完成。完成此类组件后将调用例如终止()(在看GL表面视图源代码看看我在说什么),这将终止整个 EGLprocess!从此刻开始,来自另一个已运行组件的任何 EGL 调用都将失败!

我检查了大量的示例,所有示例都在每个组件的基础上初始化和终止 EGL(实际上,我见过没有人做与GL表面视图做,其中大多数只是复制GL表面视图内部结构)。

现在我有兴趣找到一个"proper"在 Android 上使用 EGL 进行工作(关于初始化/终止)的方法。

“正确”的方式应该提供:

  1. 当任何第一个使用 EGL 的组件启动时 EGL 初始化
  2. 当使用 EGL 的最后一个组件完成时,EGL 终止
  3. 多线程。不应该限制仅从主应用程序线程进行 EGL 操作。

请注意,当没有使用 EGL/OpenGL ES 的活动实体时,(2) 对于最大限度地减少应用程序对系统资源的使用至关重要。

有任何想法吗?或者也许我忽略了有关 Android 上的 EGL 的一些内容?

Update

还有另一个有趣的相关问题:

由于每个线程仅允许一个活动渲染上下文,因此同一时间只有一个组件可以正常从主线程使用 OpenGL ES。在主线程中同时运行多个使用 OpenGL ES 的组件会导致问题,因为最后一个组件调用例如:MakeCurrent()将隐式地用他自己的上下文“替换”所有其他组件的上下文(这实际上将完全破坏组件逻辑)。

更新2(最终版)

它被揭露了(感谢罗曼·盖伊)Android 实际上有一个针对 EGL 初始化/终止问题的内部解决方法,其形式是显式的(它违反了 EGL 规范,并且 Android 文档中未提及)“引用计数”egl初始化() and 例如终止().


eglTerminate() 和eglInitialize() 是引用计数的,因此每个“组件”都可以调用它们。特别是在 Android 3.0 上,在同一个应用程序中拥有多个 OpenGL 上下文是很常见的,并且 EGL 没有任何问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Android 上正确初始化和终止 EGL 的相关文章

随机推荐

  • Vim 中的任务标签

    关于任务标签的两个问题 Vim 中还提供哪些其他任务标签 例如 TODO 有没有办法像 Eclipse IDE 一样制作自定义任务标签 对于自定义标签 我在 vimrc 中使用以下内容 您应该能够根据您的需要进行调整 if has auto
  • 跨平台上的 AES cbc 填充加密/解密(.net c# 和代号 one bouncy castle)

    加密 解密不能在跨平台上工作 我已使用此链接使用代号一内的充气城堡 AES 密码来加密 解密文本 J2ME 中使用 Bouncycastle 进行 AES 加密 解密的示例 https stackoverflow com questions
  • 从 C# winforms 应用程序将输出写入控制台[重复]

    这个问题在这里已经有答案了 可能的重复 如何在表单应用程序中显示控制台输出 窗口 https stackoverflow com questions 4362111 how do i show console output window i
  • 如何追踪 Ruby 代码中的内存泄漏?

    Question 我正在调试 rake 任务中的内存泄漏 我想查看以下调用堆栈 有生命的物体 最初分配这些对象的对象或行是什么 ruby prof 可以做到这一点吗 如果没有 我应该使用什么工具 Setup Gems 导轨 3 2 16 事
  • 在 Swift 中使用 UIAlertController 发生内存泄漏

    我使用这个简单的代码呈现一个简单的 UIViewController IBAction func addNewFeed sender UIBarButtonItem var alertView UIAlertController UIAle
  • 使用 JAR 加载 log4j.properties [重复]

    这个问题在这里已经有答案了 我有一个包含以下清单的 jar 文件 Manifest Version 1 0 Created By 1 7 0 07 Oracle Corporation Main Class test Main Class
  • Sklearn.KMeans:如何避免内存或值错误?

    我正在研究图像分类问题 并且正在创建一个词袋模型 为此 我提取了所有图像的 SIFT 描述符 并且必须使用 KMeans 算法来找到用作我的词袋的中心 这是我拥有的数据 图片数量 1584 SIFT 描述符的数量 32 个元素的向量 571
  • JAXB-XJC X属性访问器

    根据 JAXB 规范http jaxb java net 2 2 4 docs xjc html http jaxb java net 2 2 4 docs xjc html如果您想运行 JAXB XJC 编译器 您可能传递的扩展 参数之一
  • OpsHub VSO 迁移 - DataValidationException - 测试套件已存在

    在 OpsHub 从本地 TFS 2013 3 服务器迁移到 VSO 期间 我收到来自 OpsHub 的错误消息 com opshub exceptions DataValidationException OpbsHug 012017 名称
  • 从转义 ASCII 序列中读取 UTF8/UNICODE 字符

    我的文件中有以下名称 我需要将该字符串读取为 UTF8 编码的字符串 因此 test 303 246 303 270 303 245 txt 我需要获得以下信息 test txt 你知道如何使用 C 来实现这一点吗 假设你有这个字符串 st
  • 将输入传递到批处理文件中的程序提示符

    我正在使用 mpich2 并行运行模拟 我的工作站有相当严格的安全措施 每次运行模拟时都必须使用新密码进行注册 我必须输入 mpiexec register 然后提示我输入用户名 然后提示我输入密码 不幸的是 似乎没有办法在一行上将用户 通
  • 通过 Javascript 返回视图 MVC3 Razor 将值传递给控制器

    我是 MVC 的新手 我试图将使用地理位置获得的经度和纬度值传递给我的控制器 以便我可以使用这些值来识别并从数据库中提取正确的数据 这是我的 JavaScript function auto locate alert called from
  • 如何应用圆角边框来突出显示/选择

    我用过视觉工作室在线 http visualstudio com对于一个项目来说有一段时间 他们将圆形边框应用于在线代码查看器中的选择的方式非常有趣 我尝试检查该元素并寻找某种自定义 CSS 但没有成功 我有一种感觉 这需要一些复杂的 技巧
  • 如何在 makefile 中定义变量,然后在 Fortran 代码中使用它

    我试图在 makefile 中定义一个变量 然后根据是否设置了该变量 更改在我的 Fortran 例程中编译的代码块 简单的例子我无法工作 program test implicit none integer a ifdef MYVAR a
  • 在WebView中显示Android资源文件?

    我看过关于从资产提供 WebView 页面问题的各种讨论 但没有一个似乎是明确的 我希望能够使用 webview 来显示存储在项目资产中的 html 以及包含的 css 文件 我发现 wv loadUrl file android asse
  • 通过标题获取 NSMenu 树的 NSMenuItem

    我有一个NSMenu 比如说主菜单 有很多NSMenu里面有 并且NSMenuItem处于不同级别 我希望能够获取指定树路径的 NSMenuItem 实例 其中包含相应 NSMenus NSMenuItems 的标题 例子 Menu Fil
  • 如何更改输入类型=“日期”日期选择器的外观?

    我想将输入 type date 日期选择器的默认外观从箭头更改为日历图标 并使其始终可见 谷歌搜索这个问题并没有透露什么信息 我在 2012 年看到了下面的帖子 上面说这是不可能的 事情有变化吗 https developers googl
  • 为什么有些对象在 Objective-C 中使用前不需要初始化?

    为什么有些对象在 Objective C 中使用前不需要初始化 例如这是为什么NSDate today NSDate date legal 它们在内部初始化date方法 这是在 Objective C 中创建自动释放对象的常见方法 这种形式
  • 按钮标签中的 R 闪亮断线

    请看下面的玩具示例 任何帮助将不胜感激 谢谢 shinyApp ui fluidPage actionButton btnId I want a line break here br since the label is too long
  • 如何在 Android 上正确初始化和终止 EGL

    虽然有很多关于在 Android 上使用 OpenGL ES 的示例 但所有这些示例在 EGL 的初始化 终止方面似乎都是不正确的 即使是 Android SDK NDK 附带的示例 问题的根源在于 Android 应用程序模型 这使得 E