如何在不降低运动平滑度的情况下加快对象的移动速度

时间:2017-10-17 19:07:07

标签: performance opengl

这是在glutDisplayFunc()

中注册为显示功能的功能
void RenderFunction(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPointSize(5);
    glBegin(GL_POINTS);
    glVertex2i(0+i,0);
    glEnd();
    glutSwapBuffers();
    i+=1;
    glutPostRedisplay();
}

这种方式在屏幕上移动,但速度非常慢。 我可以通过将i增加到大于1来加快速度,但是动作看起来并不顺畅。如何实现更高的速度?

我过去常常使用在OpenGL顶部制作的SFML,并且使用move()方法快速移动对象。所以在OpenGL中也必须有一种方法。

2 个答案:

答案 0 :(得分:1)

在这种情况下,除了每次重绘时都能进一步提升你的观点,你可能做的事情可能不多。特别是,在这种情况下,大多数性能提升可能不会对感知速度产生任何显着影响。

问题非常简单:您一次只能按位置更改一个像素。你有屏幕更新"锁定"机会非常好。所以它与监视器的刷新一起发生。

假设情况如此,如果典型的显示器以60 Hz的频率刷新,那么您将获得每秒移动60像素的固定速率。如果您提高代码的效率,移动速度不会发生变化 - 它只会减少您用来以相同速度移动点的CPU时间。< / p>

基本上,如果速度更快,移动的唯一选择是每个屏幕刷新移动多个像素。每个屏幕刷新一个像素意味着每秒60个像素,因此(例如)在典型的高清屏幕上移动(水平1920个点)将需要1920像素/ 60像素/秒= 32秒。

如果代码非常慢,您可能会使用1%的CPU来执行此操作。使用更快的代码,可能会降低到一些不可测量的数量 - 但不管怎样,它都会以相同的速度行进,所以它需要32秒才能通过屏幕。

如果您愿意,可以从屏幕刷新中解锁屏幕更新。由于您只绘制了一个点,因此您可以以每秒几千帧的速度更新屏幕,因此点似乎会更快地在屏幕上移动批次

然而,实际上,显示器仍然只能以60 Hz的频率刷新屏幕。当您的代码更新速度快于此时,它只意味着您将生成许多从未在屏幕上显示的中间更新。就实际显示在屏幕上的图片而言,你只需每个屏幕刷新一个点移动一个点。您更新了内存中所有中间点的数据这一事实并没有真正改变任何事情。可见结果基本上与每次刷新屏幕时重新绘制一次相同,并且每次都将点移动得更远。

答案 1 :(得分:0)

使用i作为翻译组件定义模型视图矩阵。 然后将此矩阵应用于您定义的顶点。但是,是的,因为其他人正在告诉尝试转向现代OpenGL。

glMatrixMode(GL_MODELVIEW);
glTranslatef(i, i, i);