【发布时间】:2014-07-14 02:05:08
【问题描述】:
我正在使用带有 native_app_glue 的 NativeActivty 来编写适用于 Android 的 OpenGL 游戏。很难确定何时是删除堆分配对象和OpenGL 分配的对象的最佳时间。
在 NDK 的 NativeActivity 示例中,它们似乎不会在完成对象后删除它们。现在我使用两个删除函数删除我的对象:一个用于OpenGL 对象,一个用于常规对象。我将它们分开是因为似乎只有事件处理线程可以删除 OpenGL 对象。我分配的常规对象被正常的删除功能删除。
当用户按下后退按钮并返回应用程序时,OpenGL 资源被删除并且应用程序崩溃(尽管我认为它们应该由APP_CMD_INIT_WINDOW 重新分配)。这让我想知道我是否应该删除对象,因为看起来我不应该删除 OpenGL 对象。
我们是否应该使用 NDK 删除堆分配的对象。我知道 NDK 应用程序仍处于沙盒状态,并且有一个 JVM 进程,这需要内存管理吗?
编辑: 我的应用程序崩溃的另一个实例是在游戏状态结束时删除对象。例如从实际游戏到菜单。回到游戏后,即使对象被重新分配,应用程序也会崩溃。它似乎只工作一次。
【问题讨论】:
-
您可以使用智能指针而不用担心内存管理吗? Boost 智能指针在 Android 上运行良好。对于 OpenGL 部分,删除上下文应处理删除 OpenGL 对象。
-
所以我不应该打扰调用 glDeleteTextures() 和 glDeleteBuffers() 之类的函数?并且需要删除堆分配的对象(无论有没有提升)?
-
检查此线程以删除 OpenGL 端的对象:stackoverflow.com/questions/11958298/… 如果您使用 Boost 中的智能指针,则不必担心删除它们。当它们的引用达到 0 时,它们会像堆栈上声明的对象一样被自动删除。这就是为什么它们被称为智能指针。
-
好的,更多解释:当你点击返回按钮时,OpenGL上下文被删除,在这种情况下当然是EGL上下文,所以在OpenGL上声明的所有资源,如纹理、缓冲区等也被删除。当您回到 OpenGL 窗口时,您应该再次创建 EGL 上下文,然后重新分配所有 OpenGL 对象,这样您的应用程序就不会崩溃。至于堆对象,您可以像以前那样手动删除它们,也可以不使用常规指针,而是使用 Boost 或任何其他实现中的智能指针,这样您就完全不用担心微内存管理了
-
我宁愿不使用 boost,因为我试图保持低依赖。现在问题似乎出在对象的重新分配上,由于某种原因,尽管重新分配,它们似乎仍然是空指针。但是,这适用于类似的桌面应用程序。跟安卓有关系。感谢您清理 OpenGL 对象。
标签: android c++ opengl-es android-ndk native-activity