2016-09-01 7 views
1

Итак, я снова начал программировать на C++ и пытался разобраться с OpenGL. В настоящее время у меня есть базовое приложение, где я просто хочу переместить камеру с помощью клавиш. Я читал много статей об этом, но все же у меня проблемы с движением, я думаю, потому что даже если только немного, но они отличаются от моей программы. Сначала я сделал ограничение в 60 кадров в секунду и вычислил скорость с deltatime, но движение было медленным. Теперь я отключил ограничение FPS, но теперь он работает примерно на 4000 FPS, поэтому deltatime больше всего времени 0 или 1, поэтому движение действительно очень медленное. Я уверен, что не понимаю что-то в этой концепции, но мне нужно указать на это.C++ - Движение OpenGL с deltatime

Основной цикл:

while (running) { 
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { 

     if (msg.message == WM_QUIT) { 
      running = false; 

      break; 
     } else { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } else { 
     clock_t last = clock(); 
     deltaTime = last-start; 

     //if ((double)deltaTime >= 16.666666666) { 
     fps++; 
     millis += deltaTime; 
     start = last; 

     if (millis > 1000) { 
      millis = 0; 
      std::cout << "FPS: " << fps << std::endl; 
      fps = 0; 
     } 

     openglContext.renderScene(); 
     //} 
    } 
} 

WndProc ключ обработчик:

float speed = 5.0f; 

... 

case WM_KEYDOWN: 
    switch(wParam) { 
     case 0x57: 
      openglContext.updateCoordinates(0.0f, 0.0f, ((float)deltaTime/1000.0f * speed), glm::radians(angle)); 
      break; 
    } 
    break; 

Я знаю, что это не является совершенным, но, как я писал ранее, я попробовал много "решений". Надеюсь, кто-то может помочь. Заранее спасибо!

Решение:

Существует еще много сделать, но сейчас это прекрасно.

LARGE_INTEGER start; 
LARGE_INTEGER frequency; 
QueryPerformanceFrequency(&frequency); 
QueryPerformanceCounter(&start); 

while (running) { 

    ... 

     LARGE_INTEGER current; 
     QueryPerformanceCounter(&current); 
     dt = ((double)(current.QuadPart - start.QuadPart)/(double)frequency.QuadPart); 
     QueryPerformanceCounter(&start); 

     ... key handling 
     ... render 
     ... 
+1

Есть Распознать: http://gafferongames.com/game-physics/fix-your -timestep/ –

+0

@RichardCritten: Это действительно хорошая ссылка. Но я бы предложил не использовать эту стратегию для управления камерой, когда отзывчивость приложения является фактором. – BDL

+0

На самом деле я тоже это прочитал, но для меня это было слишком сложно, но, возможно, я попробую. – matthew3r

ответ

1

Проблема, которая delta_time либо 0, либо 1 происходит из-за низкой в ​​целом разрешением std::clock(). В большинстве случаев минимальное время, которое можно измерить, составляет около 0,01 секунды, что является способом меньше для приложения рендеринга. Reference

В зависимости от вашей системы и используемого компилятора существует несколько альтернатив, которые позволят вам измерять тайминги с более высокой точностью.

+0

Спасибо, я проверю. – matthew3r

+0

Я принял ваш ответ, его было не так просто реализовать, но теперь это работает. Есть еще много дел, но пока это идеально для меня, и я обновляю свой вопрос своим решением. – matthew3r

Смежные вопросы