2010-02-02 26 views
6

Bạn kiểm soát tốc độ của hoạt ảnh như thế nào? Đối tượng của tôi hoạt hình nhanh hơn trên máy của người khác.Làm cách nào để đảm bảo tốc độ hoạt ảnh OpenGL nhất quán trên các máy khác nhau?

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; 
} 

Trả lời

10

Đây là giải pháp của người nghèo:

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

đây là giải pháp tốt hơn:

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

Trong giai đoạn đầu, getframe di chuyển đối tượng của bạn bằng một số tiền cố định, nhưng điều đó dễ bị lỗi nếu tốc độ khung hình giảm xuống.

Sau đó, bạn di chuyển các đối tượng dựa trên thời gian trôi qua. Ví dụ. nếu 20ms vượt qua, bạn xoay một đối tượng 12 độ, và nếu 10ms vượt qua, bạn xoay nó 6 độ. Nói chung, hoạt ảnh nếu một hàm thời gian trôi qua.

Triển khai getticks() tùy thuộc vào bạn. Để bắt đầu, bạn có thể sử dụng glutGet(GLUT_ELAPSED_TIME).


Trong trường hợp của bạn nó sẽ giống như thế:

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; 
    } 
    } 
} 
Các vấn đề liên quan