2014-02-11 1 views
1

У меня возникла проблема, связанная с таймерами, когда я обманываю объекты в своем игровом движке. Лерпинг почти правильный, и когда я применяю привязку к объекту, движущемуся или вращающемуся, это нормально, но каждые несколько секунд он выглядит так, как будто объект быстро мигает к предыдущей позиции, прежде чем продолжать плавно перемещаться.Проблема с прошивкой с таймерами

Запуск двигателя в оконном режиме дает мне 1500 ~ fps, но если я буду работать в полноэкранном режиме с помощью vsync-зажима до 60 кадров в секунду, глюк произойдет намного чаще.

Я пытаюсь найти либо хороший ресурс, либо объяснение по поводу lerping, и как я могу улучшить то, что у меня есть.

Для разработки разрыва клеща я использую:

float World::GetTickGap() 
{ 
float gap = (float) (TimeMs() - m_lastTick)/m_tickDelay; 
return gap > 1.f ? 1.f : gap; 
} 

Моя функция обновления:

m_currentTick = TimeMs(); 
if(m_currentTick > m_lastTick+m_tickDelay) 
{ 
    m_lastTick = m_currentTick; 

      //Update actors 

    } 

Тогда при рендеринге каждого актера я даю разрыв клеща для них Lerp между их позициями.

Моя lerping функция:

float math::Lerp(float a, float b, float t) 
{ 
return a + t*(b-a); 
} 

И пример функции lerping называют:

renderPosition.x = (math::Lerp(m_LastPosition.x, m_Position.x, tickDelay)); 

Я не уверен, где начать пытаться исправить эту проблему. Насколько мне известно, это проблемы времени с функциями. Хотя может ли что-нибудь еще вызвать небольшое падение производительности с постоянной скоростью?

Любая помощь с этой проблемой была бы принята с благодарностью. :)

+0

1500 или 150? Я не знаю многих дисплеев с частотой обновления, достаточно высокой, чтобы правильно отображать 1500 кадров в секунду, а тем более такой уровень воспринимается человеческим глазом. – JAB

+0

является 'tickDelay' в последней строке так же, как' TickGap' с первого? – AShelly

+0

Сам монитор способен только на 60, но движок говорит мне, когда не под vsync он способен нарисовать мир 1500 раз в секунду. Я ожидаю, что число будет уменьшаться, когда я начну рендерить несколько объектов. – Crabbo

ответ

0

Я на самом деле не в состоянии восстановить свой код от того, что вы вывесили

Но я помню, что вызов вашей функции времени больше, чем один раз за кадр является плохой идеей в целом. Вы, кажется, это делаете. Попробуйте подумать о том, какой эффект имеет.

E.g. Это может означать, что петли «обновления Actors» не синхронизированы с интервалами «tickGap», а актеры обновляются во второй раз с 0 пробелами.