This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SK-TDA4VM:使用 OpenGL 创建图片纹理时内存泄漏

Guru**** 2537360 points
Other Parts Discussed in Thread: TDA4VM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1079250/sk-tda4vm-memory-leak-when-creating-picture-texture-with-opengl

部件号:SK-TDA4VM
“线程:测试TDA4VM”中讨论的其它部件

你(们)好  
在 OpenGL 中绘制图片纹理时,内存持续减少有问题。

以下是我的测试演示程序代码

void   渲染()
    openglInit()

    printf("drawing begin11\n");  
    布尔 测试 = 
    同时( 正确)
    {
        如果( test)
        {
            测试 = 
        }
        否则
        {
            格林德纹理(1, &testTextures);
            appEglCheckGlError (“glDeleteTextures”);
            printf("glGetError end    %d  \n", glGetError()
        }
        createTextures ("parktype/parkout _n.pn", APA_MODE_PARKOUT_N, TRUE, TRUE);
        glBindFramebuffer(GL_framebuffer) ;
        GlViewport (0, 0, scr_width, scr_height);
        GlClearColor (0.0f, 0.0f, 0.0f, 1.0f);
        GlClear (gl_color_buffer_bit  | gl_dete_buffer_bit);
        GlEnable(GL_Depth_test)
        Draw ();  
        printf("绘图 开始 %d  \n", test11);
        test11++
        glBindFramebuffer(GL_framebuffer,0) 
        GlFinish()
        appEglCheckGlError (“glFinish”)
        appEglSwap (EGL_WIN_OBJ);
        app_process_display_graph()
        睡眠(1)
    }
    destroyResources()
    返回 空;
}


无效 的缝隙纹理(字符 *文件名, int  pic_id)
    //---
    内部 宽度, 高度, nrChannels;
    光源纹理(1, 测试纹理);
    光信纹理(GL_Titure_2D, 测试纹理);
    // 设置  纹理 环绕 参数
    GlTextParameteri (gl_Texture_2D, gl_Texture_wrap_S, gl_cling_to_edge);    // 将 纹理 环绕 设置为 gl_Repeat (默认 环绕 方法)
    GlTextParameteri (gl_titer_2D, gl_tite_wrap_T, gl_cling_to_edge);
    // 设置 纹理 过滤 参数
    GlTextParameteri (gl_titer_2D, gl_tite_min_filter, gl_linear_mipmap_linear);
    GlTextParameteri (gl_Texture_2D, gl_Texture_MAG_filter, gl_linear);
    无符号 字符 *data  =  stbi_load (文件名, 宽度, 高度(&H), 宽度(&N),宽度(&N),范围(&N), 0);
    IF (数据)
    {
        GlEnable (GL_B办事处);
        GlBlendFundc (GL_SRC_alpha, GL_One_负 SRC_alpha);
        // 请注意   ,awesomeface.png 具有 透明  性,因此 是 一 个字母通道, 因此  请确保  告诉 OpenGL  数据 类型 为  GL_RGBA
        glTextImage2D (gl_texturity_2D, 0, gl_RGBA, 宽度, 高度,  0, gl_RGBA, gl_unsigned_byte, 数据);
        GlGenerateMipmap (GL_Titer_2D);
    }
    否则
    {
        ALOGD (“APA 褶皱纹理 失败, 路径 为 %s, 路径);
    }
    STBI_IMAGE_FREE (数据);  
    光信纹理(GL_Titure_2D,  0)
}

无效  Draw ()
    ourShader.use();
    GlActiveTexture (GL_TEXTURE0);
    光信纹理(GL_Titure_2D, 测试纹理);
    GlBindVertexArray (VAVO[screenStatus]); // 看到  我们 只有   一 个 VAO ,       每次都不需要绑定它, 但 我们会 这样做  以 使 事情    更有条理
    glDrawElement (gl_triangles, 6, gl_unsigned_INT, 0);
    光信纹理(GL_Titure_2D,  0)
}

destroyResources()无效  
    ourShader.deleteID();
    deleteTextureAll()
    glDeleteFramebuffers (1, m_FboID);
    GlDeleteVertexArrays (2, VBO);
    GlDeleteBuffers (1, EBO0);
    GlDeleteBuffers (1, EBO1);
    appEglWindowClose (EGL_WIN_OBJ);
}
我反复创建和删除纹理,发现删除纹理后没有释放内存,导致系统中现有纹理的持续减少。
之后,当程序启动时,我一次创建20个纹理,然后绘制它们,删除20秒后的所有纹理,并退出程序,内存不会释放。
那么,这部分记忆在哪里? 何时发布?
为什么我的 PC 测试程序不存在此问题?
这是 GPU 的处理吗?
我还发现,在创建和删除纹理的过程中,当可用内存达到700米时,我会再次删除纹理并创建纹理(删除多个纹理并创建更少的纹理)。 我发现内存目前已释放。
但是,只释放当前操作的内存。 程序退出后,内存不会作为一个整体循环利用,这一过程仍在700米左右。
我希望知道这一点的人能帮助我解决这个问题。
谢谢