2016-07-11 7 views
0

Я использую Visual Studio 2013 и OpenGL для создания симуляции. И я использую вкладки keboard для внесения определенных изменений в переменные, и обновление отображается в созданном окне.CPU intesive OpenGL функции

Однако есть небольшая задержка между нажатием клавиши и измененным выходом в окне.

Я попытался использовать инструменты диагностики Visual Studio и увидел, что есть две ключевые функции, которые были интенсивными в ЦП.

Одна была пользовательская функция, которую я создал, а другой был «дисплей/главная/__ tmainCRTStartup/mainCRTStartup

Я предполагаю, что это функция GLUT. Так это нормально или я делаю что-то неправильно?

Любая помощь будет оценена по достоинству.

void keyboard (unsigned char key, int x, int y) 
{ 
switch (key) 
{ 
    case 'r': case 'R': 
    if (filling==0) 
    { 
     glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); 
     filling=1; 
    } 
    else 
    { 
     glPolygonMode (GL_FRONT_AND_BACK, GL_POINT); 
     filling=0; 
    } 
    break; 
    case 27: 
    exit(0); 
    break; 
} 
} 

.

void display(void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(-90,0.0,1.0,0.0); 
glRotatef(-90,1.0,0.0,0.0); 

rotation_x = rotation_x + (rotation_x_increment - rotation_x)/50; 
rotation_y = rotation_y + (rotation_y_increment - rotation_y)/50; 
rotation_z = rotation_z + rotation_z_increment; 

if (rotation_x > 359) rotation_x = 0; 
if (rotation_y > 359) rotation_y = 0; 
if (rotation_z > 359) rotation_z = 0; 

if(rotation_x_increment > 359) rotation_x_increment = 0; 
if(rotation_y_increment > 359) rotation_y_increment = 0; 
if(rotation_z_increment > 359) rotation_z_increment = 0; 

glRotatef(rotation_x,1.0,0.0,0.0); 
glRotatef(rotation_y,0.0,1.0,0.0); 
glRotatef(rotation_z,0.0,0.0,1.0); 

glTranslatef(x_translate,0.0,0.0); 
glTranslatef(0.0,y_translate,0.0); 
glTranslatef(0,0,z_translate); 


glEnd(); 
glutSwapBuffers(); 
glFlush(); // This force the execution of OpenGL commands 
} 

.

int main(int argc, char **argv) 
{ 
IntroDisplay(); 
glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(screen_width,screen_height); 
glutInitWindowPosition(0,0); 
glutCreateWindow("Ultrasonic Testing"); 
glutDisplayFunc(display); 
glutIdleFunc(display); 
glutReshapeFunc (resize); 
glutKeyboardFunc (keyboard); 
glutSpecialFunc (keyboard_s); 
glutMouseFunc(mouse); 
glutMotionFunc(mouseMove); 
init(); 
glutMainLoop(); 
return 0; 
} 
+1

'mainCRTStartup' является библиотека времени выполнения родительского функция, которая вызывает ваш' main'. Так что все это говорит вам, что «главное» занимает много времени, что разумно. –

+0

Я бы попытался добавить Sleep (0) или Sleep (10) в этот цикл, чтобы узнать, не имеет значения, а также удалить glFlush(); –

+0

Остановить использование фиксированного конвейера, возможно, он будет работать быстрее;) –

ответ

2

Я скопировал код для нового проекта, я изменил функцию отображения, чтобы нарисовать треугольник, и она работает очень быстро.

(Я знаю, что это должен быть комментарий, а не ответ, но у меня недостаточно репутации для добавления комментариев).

PD: Вы можете изменить

glTranslatef(x_translate,0.0,0.0); 
glTranslatef(0.0,y_translate,0.0); 
glTranslatef(0,0,z_translate); 

в

glTranslatef(x_translate,y_translate,z_translate); 
Смежные вопросы