Функция рисования текста на экране с использованием C ++ / OpenGL / Glut быстрее, чем glutBitmapCharacter - PullRequest
2 голосов
/ 17 июня 2011

Мне нужно что-то намного быстрее, чем glutBitmapCharacter (шрифт, текст [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]);
    }
}

Каждый кадр в функции DisplayFunction в секции рисования HUD (вызывая 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 to string:

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 tздесь было ~ 3500 кадров в секунду ... так что я УВЕРЕН , что glutBitmapCharacter - проблема.Так что использовать вместо этого :)?

Тогда что делать?

1 Ответ

1 голос
/ 17 июня 2011

Если сомневаетесь, вернитесь к основам: создайте свою собственную (лучшую) функцию рисования. Создайте прямоугольную текстуру символов и нарисуйте на экране смежные квадраты (треугольные полосы) с выбранной текстурой шрифта, по одной полосе на строку символов.

Выше все в порядке с VBO, если вы решите пойти по этому пути. Единственная важная вещь - это буферизировать записей как можно больше, возможно, добавляя материал для печати на экран в массив сортов и выписывая их в конце рисования кадра одновременно.

...