Performance 如何在不降低运动平滑度的情况下提高opengl中对象的运动速度

Performance 如何在不降低运动平滑度的情况下提高opengl中对象的运动速度,performance,opengl,Performance,Opengl,以下是在glutDisplayFunc()中注册为显示函数的函数 这样,点在屏幕上移动,但速度非常慢。 我可以通过以大于1的数字递增I来加快速度,但这样一来,运动看起来就不平滑了。如何实现更高的速度 我曾经使用在OpenGL顶部制作的SFML,在那里,对象通过move()方法移动得非常快。因此,OpenGL中也必须有一种方法。使用i作为转换组件定义模型视图矩阵。 然后将此矩阵应用于要定义的顶点。但是,正如其他人所说的,我们应该尝试转向现代OpenGL glMatrixMode(GL_MODELV

以下是在
glutDisplayFunc()中注册为显示函数的函数

这样,点在屏幕上移动,但速度非常慢。 我可以通过以大于1的数字递增
I
来加快速度,但这样一来,运动看起来就不平滑了。如何实现更高的速度


我曾经使用在OpenGL顶部制作的SFML,在那里,对象通过
move()
方法移动得非常快。因此,OpenGL中也必须有一种方法。

使用i作为转换组件定义模型视图矩阵。 然后将此矩阵应用于要定义的顶点。但是,正如其他人所说的,我们应该尝试转向现代OpenGL

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

在这种情况下,除了每次重新绘制时将点进一步移动之外,您可能没有什么可以做的。特别是,在这种情况下,大多数性能改进可能不会对感知速度产生任何显著影响

问题相当简单:每次更改一个像素的位置。屏幕更新很有可能被“锁定”,所以它是在显示器刷新的同时发生的

假设是这样的话,一个典型的显示器刷新频率为60赫兹,你会得到一个固定的速度,你的点每秒移动60像素。如果您提高代码的效率,移动速度不会改变——它只会减少以相同速度移动点所用的CPU时间

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

对于非常慢的代码,您可能需要使用1%的CPU来完成这项工作。使用更快的代码,这可能会下降到一些无法测量的小数量——但无论哪种方式,它都将以相同的速度运行,因此需要32秒才能通过屏幕

如果愿意,可以从屏幕刷新中解锁屏幕更新。因为你只画了一个点,你可能会以每秒几千帧的速度更新屏幕,所以点在屏幕上的移动速度会快得多


然而,在现实中,显示器仍仅以60 Hz的频率刷新屏幕。当你的代码更新速度超过这个速度时,这就意味着你将产生大量的中间更新,而这些更新永远不会出现在屏幕上。就屏幕上实际显示的图片而言,每次屏幕刷新只需移动一个像素以上的点。您更新了内存中所有中间点的数据这一事实实际上并没有改变任何事情。可见结果基本上与每次屏幕刷新时重新绘制一次相同,并且每次都将点进一步移动。

不要使用
glBegin/End
。这是固定的功能管道,可能是您最大的性能打击之一。谢谢。那我应该用什么?我是opengl新手,我读的材料刚开始/结束。你能建议我如何获得更高的速度吗?
glMatrixMode(GL_MODELVIEW);
glTranslatef(i, i, i);