为什么 OpenGL ES 2.0 在 Android 上会泄漏图形内存,但使用相同的代码却不会在 iOS 上泄漏

问题描述 投票:0回答:2

我有一个基于 Android NDK 的游戏,我们部分使用开源引擎 (Cocos2d-x) 的部分构建该游戏。大多数引擎都是自定义的,但对于 OpenGL 上下文设置、Java 桥接和事件等内容,我们发现使用现成的解决方案很方便。

快进到今天,我们遇到了稳定性问题,cocos2d-x 不再维护,我们遇到了一些严重的稳定性问题。我花了大约 1 周的时间对此进行调试,但未能找到追踪它的方法。这是我尝试过的

  • 使用它附带的旧NDK进行编译
  • 尽可能旧地更改 SDK
  • 使用 HWASan
  • 设置检查JNI
  • 尝试审核所有 JNI 桥代码

崩溃的方式差异很大

  • 当连接到调试器时,它会在第一秒内崩溃。几乎总是在 Android 运行时中。多次围绕垃圾收集或涉及 JNI 桥
  • 不连接调试器时,有时会稳定。
  • 当连接 HWASan 时,如果 OpenGL 设置为在手机上使用它,它偶尔会在 ANGLE 库中崩溃
  • 有时图形内存会简单地泄漏并最终导致崩溃,而有时则根本不会泄漏

我还想说,该应用程序在除 Android 之外的所有其他平台上都非常稳定,并且我们 95% 的代码都在共享 C++ 中。我什至注释掉了在 C++ 中实际启动我们的代码,但游戏仍然在黑屏上崩溃,只有开箱即用的引擎代码。

我正在考虑移植到 SDL,这样引擎至少会得到支持,但如果有人有任何关于追踪此类事情的提示,我会很高兴听到它。

更新:

我相信连接到调试器时的崩溃问题可能是引擎设置的一个单独问题。对于生产用户来说,问题似乎是来自帧缓冲区或纹理的 OpenGL 图形内存没有被释放回系统。我应该注意到,代码与iOS相同,没有这个问题,所以它一定与共享上下文或驱动程序的工作方式有关。我会接受任何只能解决这个问题的答案。

java android c++ opengl android-ndk
2个回答
0
投票

你可以检查这个链接,它在记忆中的讨论中 https://github.com/google/sanitizers/wiki/AddressSanitizerInHardware


0
投票

有点遥远,但是您是否使用各种线程,即加载线程? Android 中有很多东西必须在主线程上操作,如果你不这样做,你就会遇到这种“有时有效,大多数情况下无效”的情况。

我对你有感觉。移动操作系统大约每两年就会破坏旧代码,而不会产生任何负罪感,如果您使用的东西没有更新,您基本上必须获取源代码并自己维护。我们最终决定用两个月的时间来编写我们自己的框架。

© www.soinside.com 2019 - 2024. All rights reserved.