【问题标题】:Function to draw text on screen using C++/OpenGL/Glut faster than glutBitmapCharacter使用 C++/OpenGL/Glut 在屏幕上绘制文本的函数比 glutBitmapCharacter 更快
【发布时间】:2011-06-17 11:56:31
【问题描述】:

我需要比 glutBitmapCharacter(font, text[i]) 更快的东西。它正在降低性能几次!我需要显示 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(可能少几帧)

使用 DrawHUD + 1 x GlutPrint ~ 3300

使用 DrawHUD + 2 x GlutPrint ~ 2400

使用 DrawHUD + 3 x GlutPrint ~ 1700

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

{
[...]

glutPrint(...);
glutPrint(...);
glutPrint(...);

[...]
}

)

这不好...我知道使用帧速率测量不好。

还有

当我发表评论时:

glutBitmapCharacter(字体,文本[i]);

在 glutPrint 的循环中有 ~3500 fps ...所以我确定 glutBitmapCharacter 是问题。那么它有什么用呢:)?

那该怎么办?

【问题讨论】:

  • 我怀疑 glutBitmapCharacter 是一个瓶颈。请显示调用代码的上下文。
  • 是时候放弃过剩了。您的问题记录得太少,无法建议更好的库。
  • 我不确定是否存在过剩,但我知道在 GDI 等中,最好先在缓冲区上绘制,然后再绘制缓冲区。
  • @Mat:这里不是这样。 glutBitmapCharacter 只是为 glBitmap 提供了一点便利。 glBitmap 本身很快,但如果在错误的上下文中使用可能会触发一些性能影响。
  • 嗯,这可真是诡计。我看不出你应该在那里遇到 OpenGL 同步点的原因。你用什么GPU?它是 AMD/ATI 的吗?如果是这样,那我就不会那么惊讶了。现在其他人已经告诉你不要使用 GLUT。我同意,但我认为 glBitmap 会导致我没想到的下降。无论如何,为了测试,试试glutStrokeCharacter,看起来不那么漂亮,但确实使用GL_LINES绘制字符openglut.sourceforge.net/group__fonts.html

标签: c++ opengl text drawing glut


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多