同代码下OpenGL ES 2.0在Android漏显存iOS正常的排查求助
Android NDK游戏稳定性及显存泄漏问题排查求助
我开发了一款基于Android NDK的游戏,部分基于已停止维护的开源引擎Cocos2d-x搭建,多数引擎逻辑为自定义,仅OpenGL上下文配置、Java桥接及事件处理等采用现成方案。
目前游戏出现严重稳定性问题,我耗时一周调试仍未定位问题,已尝试以下方案:
- 使用配套旧版NDK编译
- 降级至兼容的最旧SDK
- 启用
HWASan - 开启
CheckJNI - 审计所有JNI桥接代码
崩溃表现差异较大:
- 连接调试器时,几乎1秒内于Android运行时崩溃,常与垃圾回收或JNI桥接相关
- 未连接调试器时,有时能稳定运行
- 启用
HWASan且手机OpenGL使用ANGLE库时,偶尔在ANGLE库中崩溃 - 有时会出现显存泄漏最终导致崩溃,有时则无泄漏
需说明的是,游戏在除Android外的其他平台均稳定,95%代码为共享C代码。我甚至注释掉C业务代码,仅保留引擎原生代码,游戏仍会黑屏崩溃。
我正考虑迁移至SDL以获得支持,希望得到此类问题的排查建议。
更新:
我认为连接调试器时的崩溃是引擎配置的独立问题。生产环境中,问题似乎是帧缓冲或纹理的OpenGL显存未释放回系统。需注意iOS端同代码无此问题,推测与共享上下文或驱动机制有关。仅解决该显存问题的方案也可接受。
结论
Android开发体验糟糕,后台线程中的随机非纹理相关绘制调用会直接导致泄漏。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

