Android OpenGL ES同逻辑代码颜色纹理渲染结果不一致问题
问题根本原因
两段代码渲染结果不一致和OpenGL ES逻辑无关,核心是第一段代码的窗口资源生命周期管理错误:
- 第一段代码里
WindowSurface windowSurface是init()函数内的栈上局部变量,init()执行完毕返回时,这个局部变量会立刻析构,它持有的原生窗口资源(EGLNativeWindowType window)会被直接回收。 - 之后调用
drawFrame()渲染时,之前创建的EGLSurface绑定的窗口已经被销毁,所有GL绘制、缓冲区交换操作都没有有效的输出目标,自然无法正常显示纹理。 - 第二段代码的
WindowSurface定义在main()函数内,生命周期覆盖了EGL初始化、渲染、程序退出的全流程,渲染阶段窗口资源始终有效,所以可以正常出图。
修复方法
把WindowSurface实例的定义从init()函数内移出,放到全局作用域或者main()函数中,保证它的生命周期覆盖所有渲染操作、EGL资源清理的全流程即可。
参考修改方式:
- 在全局变量区域新增全局窗口实例持有:
// 保留原有全局变量,新增以下定义 std::unique_ptr<WindowSurface> g_main_window;
- 修改
init()函数内的窗口创建逻辑,替换原局部变量定义:
bool init() { EGLint configAttribs[] = { EGL_DEPTH_SIZE, 0, EGL_NONE}; // 替换原局部WindowSurface定义 g_main_window = std::make_unique<WindowSurface>(); EGLNativeWindowType window = g_main_window->getSurface(); // 后续原有EGL、GL初始化逻辑无需改动 // ... }
排查这类EGL/OpenGL ES渲染异常时,优先核对跨流程核心资源的生命周期:原生窗口、EGLContext、EGLSurface这类资源的持有对象,绝对不能定义在早于渲染流程结束的局部作用域中。
内容的提问来源于stack exchange,提问作者Rajeev
相关产品推荐
相关产品推荐

