我在 VS 上玩 C++,使用 OpenGL 渲染/移动形状,使用 Win32 进行窗口显示等(从 glut 显示移过来)
如何控制帧率?
我看到很多使用 dt
和某种形式的帧刷新的例子,但我不确定如何实现这个......有什么可以作为 Win32 的一部分使用的,或者可以用更简单的方法完成吗?
此外,可能是一个愚蠢的问题,但是,如果没有实现,默认帧速率是多少?还是没有?
最佳答案
我的 USB 驱动器上有一些非常旧的代码,它们使用了旧的 OpenGL 和 glut,即使在更现代的版本中也适用相同的计时原则,但绘制代码会有所不同。该代码用于不精确的计时,但足以说明如何粗略地实现设定的 FPS:
// throttle the drawing rate to a fixed FPS
//compile with: g++ yourfilenamehere.cpp -lGL -lglut
#include <cstdlib>
#include <iostream>
#include <GL/gl.h>
#include <GL/glut.h>
GLint FPS = 0;
void FPS(void) {
static GLint frameCounter = 0; // frames averaged over 1000mS
static GLuint currentClock; // [milliSeconds]
static GLuint previousClock = 0; // [milliSeconds]
static GLuint nextClock = 0; // [milliSeconds]
++frameCounter;
currentClock = glutGet(GLUT_ELAPSED_TIME); //has limited resolution, so average over 1000mS
if ( currentClock < nextClock ) return;
FPS = frameCounter/1; // store the averaged number of frames per second
previousClock = currentClock;
nextClock = currentClock+1000; // set the next clock to aim for as 1 second in the future (1000 ms)
frameCounter=0;
}
void idle() {
static GLuint previousClock=glutGet(GLUT_ELAPSED_TIME);
static GLuint currentClock=glutGet(GLUT_ELAPSED_TIME);
static GLfloat deltaT;
currentClock = glutGet(GLUT_ELAPSED_TIME);
deltaT=currentClock-previousClock;
if (deltaT < 35) {return;} else {previousClock=currentClock;}
// put your idle code here, and it will run at the designated fps (or as close as the machine can get
printf(".");
//end your idle code here
FPS(); //only call once per frame loop
glutPostRedisplay();
}
void display() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
// Set the drawing color (RGB: WHITE)
printf("FPS %d\n",FPS);
glColor3f(1.0,1.0,1.0);
glBegin(GL_LINE_STRIP); {
glVertex3f(0.25,0.25,0.0);
glVertex3f(0.75,0.25,0.0);
glVertex3f(0.75,0.75,0.0);
glVertex3f(0.25,0.75,0.0);
glVertex3f(0.25,0.25,0.0);
}
glEnd();
glutSwapBuffers();
}
void init() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27: // escape key
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("FPS test");
glutIdleFunc(idle);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
init();
glutMainLoop();
return 0;
}
希望这会有所帮助:) 如果您需要更多信息,请告诉我。
关于c++ - 控制帧率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20217776/