Как убедиться, что скорость анимации OpenGL одинакова на разных машинах? - PullRequest
6 голосов
/ 02 февраля 2010

Как вы контролируете скорость анимации?Мои объекты оживляются быстрее на чужой машине.

void idle(void){

if (!wantPause){    
    circleSpin = circleSpin + 2.0;      //spin circles
    if(circleSpin > 360.0)
{
        circleSpin = circleSpin - 360.0;
}

        diamondSpin = diamondSpin - 4.0;    //spin diamonds
    if(diamondSpin > 360.0)
{
        diamondSpin = diamondSpin + 360.0;
}
        ellipseScale = ellipseScale + 0.1;  //scale ellipse
    if(ellipseScale > 30)
{
        ellipseScale = 15;
}
glutPostRedisplay();
}
}

void drawScene()
{
 ...
glColor3f(1,0,0);
glPushMatrix();
glRotatef(circleSpin,0,0,1);
drawOuterCircles();
glPopMatrix();
}


int main (int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowSize(400,400);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Lesson 6");
init();
glutDisplayFunc(drawScene);
glutKeyboardFunc(keyboard);
glutReshapeFunc(handleResize);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}

1 Ответ

10 голосов
/ 02 февраля 2010

Это решение для бедняка:

FPS = 60.0;
while (game_loop) {
    int t = getticks();
    if ((t - t_prev) > 1000/FPS)
        process_animation_tick();
    t_prev = t;
}

это лучшее решение:

GAME_SPEED = ...
while (game_loop) {
    int t = getticks();
    process_animation((t - t_prev)*GAME_SPEED/1000.0);
    t_prev = t;
}

В первом случае getframe перемещает ваш объект на фиксированную величину, но это может привести к ошибкам, если частота кадров упадет.

В последнем случае вы перемещаете объекты на основе прошедшего времени. Например. если прошло 20 мс, вы поворачиваете объект на 12 градусов, а если 10 мс, вы поворачиваете его на 6 градусов. В общем, анимация, если функция времени прошла.

Реализация getticks() зависит от вас. Для начала вы можете использовать glutGet(GLUT_ELAPSED_TIME).


В вашем случае это будет выглядеть примерно так:

int old_t;

void idle(void) {
  int t = glutGet(GLUT_ELAPSED_TIME);
  int passed = t - old_t;
  old_t = t;
  animate( passed );
  glutPostRedisplay();
}

void animate( int ms )
{  
  if (!wantPause){    
    circleSpin = circleSpin + ms*0.01;      //spin circles
    if(circleSpin > 360.0)
    {
      circleSpin = circleSpin - 360.0;
    }
    diamondSpin = diamondSpin - ms*0.02;    //spin diamonds
    if(diamondSpin > 360.0)
    {
        diamondSpin = diamondSpin - 360.0;
    }
    ellipseScale = ellipseScale + ms*0.001;  //scale ellipse
    if(ellipseScale > 30)
    {
        ellipseScale = 15;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...