函数使用C++/OpenGL/Glut在屏幕上绘制文本的速度比glutBitmapCharacter快

Function to draw text on screen using C++/OpenGL/Glut faster than glutBitmapCharacter

本文关键字:文本 绘制 速度 glutBitmapCharacter 屏幕 C++ OpenGL Glut 函数      更新时间:2023-10-16

我需要比glutBitmapCharacter(font,text[I])更快的muuuch。性能下降了好几次!我需要显示fps,xyz位置等,所以不是在3D只是显示HUD。

目前我正在使用:

glRasterPos2f(x,y);
for (int i=0; i<text.size(); i++)
{
   glutBitmapCharacter(font, text[i]);
}

我正在使用这个功能:

void glutPrint(float x, float y, LPVOID font, string text) 
{ 
    glRasterPos2f(x,y); 
    for (int i=0; i<text.size(); i++)
    {
        glutBitmapCharacter(font, text[i]);
    }
}

绘图HUD部分DisplayFunction中的每个帧(调用DrawHUD()):

void DrawHUD (void)
{
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrtho(0.0, windowWidth, windowHeight, 0.0, -1.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClear(GL_DEPTH_BUFFER_BIT);
    glColor3f(0.2f,0.2f,0.2f);
    glutPrint(2,10,glutFonts[4],its(sfps)+" fps; "+its(todrawquads)+" quads drawing; ");
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
}

也使用int到字符串函数:

string its(int i)
{
stringstream out;
out << i;
return out.str();
}

关于性能的一些事实(以FPS衡量)

不调用DrawHUD功能~3500

调用DrawHUD功能~3500(可能会少一些fps)

带DrawHUD+1 x GlutPrint~3300

带DrawHUD+2 x GlutPrint~2400

带DrawHUD+3 x GlutPrint~1700

(例如,当我的意思是3 x GlutPrint时,我的意思在DrawHUD中:

{
[...]
glutPrint(...);
glutPrint(...);
glutPrint(...);
[...]
}

)

这不太好。。。我知道用帧速率测量是不好的。

此外

当我评论:

glutBitmapCharacter(字体,text[i]);

在glutPrint的循环中,有大约3500帧/秒。。。所以我确信glutBitmapCharacter是个问题。那么它有什么用呢:)?

那该怎么办?

如果有疑问,请回到基础:创建自己的(更好的)绘图函数。制作一个矩形的字符纹理,并在屏幕上绘制连续的四边形(三角形条纹),选择字体纹理,每个字符串一个条纹。

如果你选择走这条路,上面的内容仍然适用于VBO。唯一重要的是尽可能多地缓冲写入,可能是通过将要打印到屏幕上的东西添加到排序数组中,并在帧绘制结束时同时将它们写出来。