【发布时间】: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