图像加载导致 OpenGL 中的处理缓慢

Posted

技术标签:

【中文标题】图像加载导致 OpenGL 中的处理缓慢【英文标题】:Image loading causes slow processing in OpenGL 【发布时间】:2013-03-01 05:35:40 【问题描述】:

我目前正在做一个需要加载图像的项目。我正在使用 SOIL 库加载 JPEG 图像。我必须在投影区域移动球。在没有加载图像的情况下,球的运动可以正常工作,但随着图像的加载,它会变得缓慢。我应该怎么做才能在图像仍然加载的情况下顺利更新图形。

GLuint tex_2d = SOIL_load_OGL_texture
(
    "<image_path>ImageName.jpg",
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);

glBindTexture(GL_TEXTURE_2D, tex_2d);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
    glTexCoord3f(0.0f,0.0f,0.0f);        glVertex3f(factor*BOARD_BREADTH/2,-factor*BOARD_LENGTH/2,0);
    glTexCoord3f(0.0f,1.0f,0.0f);        glVertex3f(factor*BOARD_BREADTH/2,factor*BOARD_LENGTH/2,0);
    glTexCoord3f(1.0f,1.0f,0.0f);        glVertex3f(-factor*BOARD_BREADTH/2,factor*BOARD_LENGTH/2,0);
    glTexCoord3f(1.0f,0.0f,0.0f);        glVertex3f(-factor*BOARD_BREADTH/2,-factor*BOARD_LENGTH/2,0);
glEnd();

【问题讨论】:

【参考方案1】:

我应该怎么做才能使图像在仍然加载的情况下顺利更新。

不会在每次重绘时重新加载图像。同样做你现在做的事情会导致大量内存泄漏,因为你可能不会删除每帧创建的纹理。将整个tex_2d = SOIL_load_OGL_texture 移动到一次性初始化代码中。

【讨论】:

【参考方案2】:

简单的程序风格:

init() 
    // load texture here
    // load shaders and other resources


render() 
    // use resources here to draw something       

主要代码:

main() 
    init();
    while(still_running())
    
        // update all
        render();
    
    // clean up here

注意init 只被调用一次,但render 每秒被调用60 次。在您的代码中,您每秒创建 60 个纹理! (尽管它们具有相同的像素!)

【讨论】:

以上是关于图像加载导致 OpenGL 中的处理缓慢的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL 帧缓冲区缓慢且自发停止。广泛使用时甚至会导致系统崩溃

纹理不填充图形 - OpenGL

在OpenGL中加载图像以用于GIS应用程序

辅助线程中的 OpenGL 渲染

从 URL 字符串中提取的 UITableViewController 中的图像加载缓慢

如何从OpenGL加载图像?