Я хочу написать программу с двумя буферами и показывать в консоли частоту кадров 30 кадров в секунду. Я использую Open GL — C ++
Display()
{
glutSwapBuffers();
}
Таймер для fps:
void mytimer(int fps)
{
glutTimerFunc(1000/30 , mytimer, 0);
glutPostRedisplay();
}
Этот код рисует линию, но я хочу нарисовать линию с частотой кадров 30 кадров в секунду.
void drawScene (void){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glVertex2f(0.0,0.0);
glVertex2f(120.0,120.0);
glEnd();
glFlush();
}
int main (int argc ,char** argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(360,360);
glutCreateWindow("mohammad");
initRendering();
mytimer(fps);
//glutDisplayFunc(drawScene);
glutDisplayFunc(Display);
glutMainLoop();
return (0);
}
glutTimerFunc(1000/30 , mytimer, 0);
говорит GLUT «отныне звоните mytimer
каждые 1000/30 миллисекунд «. Вы, вероятно, хотите позвонить с main
, В противном случае GLUT не будет знать, что вы написали функцию таймера.
Первый шаг.
У вас есть эта строка в вашем коде?
glutIdleFunc(idle);
Если да, перейдите к методу idle () и прокомментируйте все внутри. Вы должны заставить glutIdleFunc()
ничего не делать. Обычно у вас есть это:
// executes every time if there is nothing to do basically.
void idle()
{
glutPostRedisplay(); //draw a frame
}
// callback
glutIdleFunc(idle);
Поскольку обратный вызов (glutIdleFunc) вызывает idle () каждый раз, когда opengl не имеет ничего лучшего, то вы не можете контролировать fps, вам нужно отключить это. Тогда ваш таймер должен работать отлично.
Вот мой кусок кода, чтобы ограничить до 60 кадров в секунду. Работает отлично.
void frame_limit(int value)
{
glutPostRedisplay();
glutTimerFunc(1000 / 60, frame_limit, 0);
}
void idle()
{
//glutPostRedisplay();
}void setupCallbacks()
{
glutCloseFunc(cleanup);
glutDisplayFunc(display);
glutIdleFunc(idle);
glutTimerFunc(1000 / 60, frame_limit, 0);
}
void init(int argc, char* argv[])
{
createShaderProgram();
createBufferObjects();
setupCallbacks();
}
int main(int argc, char* argv[])
{
init(argc, argv);
glutMainLoop();
exit(EXIT_SUCCESS);
}