我正在使用OpenGL构建一个迷宫小老鼠模拟应用,并且我有一种预感我没有正确地处理事情。特别是,我怀疑我以接近恒定的帧速率(60 FPS)刷新我的(大部分静态)图形的方式。我的方法如下:
1)启动计时器 2)绘制我的形状和文本(约一千个):
"问题"在于上述方法会严重占用我的CPU,进程使用率达到了96-100%。我知道使用大量CPU本身并没有什么问题,但我觉得我不应该一直使用那么多。而最让人头疼的是,大部分图形从一帧到另一帧都没有变化。实际上只是一个多边形移动并遮盖一些静态形状。有没有办法告诉OpenGL只重绘自上一帧以来发生了变化的部分(这样可以减少glxxx调用的次数,我认为这是"问题"的根源)?或者,更好的方法是我正确地刷新了我的图形吗?"
1)启动计时器 2)绘制我的形状和文本(约一千个):
glBegin(GL_POLYGON);
for (Cartesian vertex : polygon.getVertices()) {
std::pair<float, float> coordinates = getOpenGlCoordinates(vertex);
glVertex2f(coordinates.first, coordinates.second);
}
glEnd();
并且
glPushMatrix();
glScalef(scaleX, scaleY, 0);
glTranslatef(coordinates.first * 1.0/scaleX, coordinates.second * 1.0/scaleY, 0);
for (int i = 0; i < text.size(); i += 1) {
glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, text.at(i));
}
glPopMatrix();
3) 调用
glFlush();
4) 停止计时器
5) 休眠 (1/FPS - 持续时间) 秒
6) 调用
glutPostRedisplay();
"问题"在于上述方法会严重占用我的CPU,进程使用率达到了96-100%。我知道使用大量CPU本身并没有什么问题,但我觉得我不应该一直使用那么多。而最让人头疼的是,大部分图形从一帧到另一帧都没有变化。实际上只是一个多边形移动并遮盖一些静态形状。有没有办法告诉OpenGL只重绘自上一帧以来发生了变化的部分(这样可以减少glxxx调用的次数,我认为这是"问题"的根源)?或者,更好的方法是我正确地刷新了我的图形吗?"
glBegin/glEnd
,那么getOpenGlCoordinates
和coordinates.first、coordinates.second
看起来像函数和类属性的访问,需要编写代码。这些内容不应该在glBegin/gllEnd
内部,因为传递原始数据的数组速度更快。如果传递原始数据,那么glVertex2fv
比glVertex2f
更快。 - Spektre