You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android OpenGL ES同逻辑代码颜色纹理渲染结果不一致问题

问题根本原因

两段代码渲染结果不一致和OpenGL ES逻辑无关,核心是第一段代码的窗口资源生命周期管理错误:

  • 第一段代码里WindowSurface windowSurface是init()函数内的栈上局部变量,init()执行完毕返回时,这个局部变量会立刻析构,它持有的原生窗口资源(EGLNativeWindowType window)会被直接回收。
  • 之后调用drawFrame()渲染时,之前创建的EGLSurface绑定的窗口已经被销毁,所有GL绘制、缓冲区交换操作都没有有效的输出目标,自然无法正常显示纹理。
  • 第二段代码的WindowSurface定义在main()函数内,生命周期覆盖了EGL初始化、渲染、程序退出的全流程,渲染阶段窗口资源始终有效,所以可以正常出图。
修复方法

把WindowSurface实例的定义从init()函数内移出,放到全局作用域或者main()函数中,保证它的生命周期覆盖所有渲染操作、EGL资源清理的全流程即可。
参考修改方式:

  1. 在全局变量区域新增全局窗口实例持有:
// 保留原有全局变量,新增以下定义
std::unique_ptr<WindowSurface> g_main_window;
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:09:45