linux和windows中的速度不匹配 void myDisplay(void)//glutDIsplayFunc(myDisplay) { 而(1) { glClear(GLU颜色缓冲位); x=rand()%680; y=rand()%680; sx=(x-p)/100; sy=(y-q)/100; GL3F(0.7+sx,0.1-sy,0.6); 对于(g=0;g

linux和windows中的速度不匹配 void myDisplay(void)//glutDIsplayFunc(myDisplay) { 而(1) { glClear(GLU颜色缓冲位); x=rand()%680; y=rand()%680; sx=(x-p)/100; sy=(y-q)/100; GL3F(0.7+sx,0.1-sy,0.6); 对于(g=0;g,c,linux,opengl,glut,C,Linux,Opengl,Glut,您使用的是完全独立于fps的运动矢量。这意味着它将在不同的机器上以不同的速度运行。根据您的描述,我猜在您的Linux机器上,已启用同步到vblank,将您的帧速率限制为显示器的刷新率(通常为60Hz),而在windows计算机上,它被禁用,以更高的频率运行 您应该使用计时器控制动画,并以sapce单位/时间单位定义动画速度 此外,您应该遵循Andon M.Coleman的建议:GLUT display回调意味着绘制单个帧。如果您希望动画覆盖多个帧,请使用一些变量来存储当前状态(例如,当前位置和方

您使用的是完全独立于fps的运动矢量。这意味着它将在不同的机器上以不同的速度运行。根据您的描述,我猜在您的Linux机器上,已启用同步到vblank,将您的帧速率限制为显示器的刷新率(通常为60Hz),而在windows计算机上,它被禁用,以更高的频率运行

您应该使用计时器控制动画,并以sapce单位/时间单位定义动画速度


此外,您应该遵循Andon M.Coleman的建议:GLUT display回调意味着绘制单个帧。如果您希望动画覆盖多个帧,请使用一些变量来存储当前状态(例如,当前位置和方向向量)并为每个步骤更新它们。按照您当前的实现方式,GLUT的事件处理将在整个动画期间被阻止。在windows上,这甚至可能触发“应用程序没有响应”警告,当动画太长时,

不要在这样的绘图循环中间交换缓冲区,这只是简单的疯狂。仅此一点。将其提升到循环之外。这可能会毁掉我的整个翻译方法谢谢。这个网站让我意识到我对编程的了解是多么少。我只在大学的最后一年离开,我认为我永远都无法掌握这个编程。没有人能够掌握编程。他们一直学习新东西,直到最后一年“停止编程。这就是它的美!”瑞希:不要太担心。我已经用C++ 20年了,同事们总是震惊地发现我在这么多年之后使用的C++标准库的数量是多么少(这不是他们认为C++所能掌握的);我更喜欢C标准库,到处都是疯狂的角括号和冒号。我永远不会“精通”C++或ObjuleC,因为我不能阅读它,而且每一个新的语言版本都会变得更糟:(你会及时发现重要的东西。我不知道……我只想在C、C++和OpenGL中最好,但是全世界都强迫我学习java,因为java的作业数量很多。谢谢你的漂亮回复:)
void myDisplay(void)  //glutDIsplayFunc(mydisplay)
{
  while(1)
  {
    glClear(GL_COLOR_BUFFER_BIT);
    x=rand()%680;
    y=rand()%680;
    sx=(x-p)/100;
    sy=(y-q)/100;
    glColor3f(0.7+sx,0.1-sy,0.6);

    for(g=0;g<120;g++)
    {
      p+=sx;
      q+=sy;
      glBegin(GL_POINTS);
      glVertex2i(p,q); 
      glEnd();
      glutSwapBuffers();
    }
  }
}