QGLWidget bindTexture用于动态文本消耗更多内存

时间:2013-06-20 11:53:49

标签: qt opengl qglwidget

我有一种情况,我需要在openGL窗口上打印动态文本(每20毫秒更新一次)。我正在使用QGLWidget,其中paintGL方法是使用本机openGL命令实现的。我尝试使用renderText,但发现定位文本有问题。所以我决定采用渲染位图文本的方法。对于要绘制的每个文本,我将创建一个QImage并渲染此图像。一切都按照正确尺寸在正确位置呈现的预期文本工作。到现在为止还挺好。但是(一个很大的一个:P),如果我查看我的应用程序内存扩展,即使没有更新可用,它也会增长和增长。我对在动态情况下使用bindTexture接口持怀疑态度。编译图像纹理可以使用吗?有人帮我理解这个问题。并提供一些可能的解决方案:)

void DrawText(Pos_st f_img_pos, Rot_st f_img_Rot, Dimensions_st f_Img_Dim, QString Text)
{
   Rot_st f_img_Rot1;
   QImage f_TextImg(fontImageWidth, fontImageHeight,QImage::Format_ARGB8555_Premultiplied);
   QPainter f_Painter(&f_TextImg);
   f_Painter.setCompositionMode(QPainter::CompositionMode_Source);
   f_Painter.setBrush(Qt::transparent);
   f_Painter.fillRect(f_TextImg.rect(), Qt::transparent);
   f_Painter.setPen(QColor(f_Color.g_Red_sfl32 * 255 , f_Color.g_Green_sfl32 * 255 ,  
   f_Color.g_Blue_sfl32 * 255));
   f_Painter.setFont(QFont(Text, f_TextFont_st.g_FontSize_si32,  
   f_TextFont_st.g_FontConst_enm));
   f_Painter.drawText(f_TextImg.rect(), Qt::AlignCenter, Text);
   LoadPicture(f_img_pos, f_img_Rot1, f_Img_Dim, bindTexture(f_TextImg));
}

void LoadPicture(Pos_st f_img_pos, Rot_st f_img_Rot, Dimensions_st f_img_Dim, GLuint f_Img_ID  )
{
    glTranslated( f_img_pos.g_XPOS_sfl32 , f_img_pos.g_YPOS_sfl32 , f_img_pos.g_ZPOS_sfl32 );    
    glRotatef( f_img_Rot.g_Angle_sfl32 , f_img_Rot.g_XROT_sfl32 , f_img_Rot.g_YROT_sfl32 , f_img_Rot.g_ZROT_sfl32 ); 

    glColor4f( 250, 235, 215 , 1.0f );    
    glEnable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, f_Img_ID );
    glBegin(GL_QUADS);
    glTexCoord2d(0.0,0.0);
    glVertex3f( -f_Img_Dim.g_Img_Width_sfl32/2 , -f_Img_Dim.g_Img_Height_sfl32/2, 0.0f);
    glTexCoord2d(0.0,1.0);
    glVertex3f( -f_Img_Dim.g_Img_Width_sfl32/2 , +f_Img_Dim.g_Img_Height_sfl32/2 , 0.0f);
    glTexCoord2d(1.0,1.0);
    glVertex3f( +f_Img_Dim.g_Img_Width_sfl32/2 , +f_Img_Dim.g_Img_Height_sfl32/2 , 0.0f);
    glTexCoord2d(1.0,0.0);
    glVertex3f( +f_Img_Dim.g_Img_Width_sfl32/2 , -f_Img_Dim.g_Img_Height_sfl32/2 , 0.0f);

    glEnd();
    glFlush( );
        glDisable(GL_TEXTURE_2D);
    glDisable(GL_BLEND);
}

0 个答案:

没有答案