图像加载导致 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 帧缓冲区缓慢且自发停止。广泛使用时甚至会导致系统崩溃