Я написал компонент для отображения текущего FPS.
Наиболее важная его часть:
public override void Update(GameTime gameTime)
{
elapseTime += (float)gameTime.ElapsedRealTime.TotalSeconds;
frameCounter++;
if (elapseTime > 1)
{
FPS = frameCounter;
frameCounter = 0;
elapseTime = 0;
}
base.Update(gameTime);
}
public override void Draw(GameTime gameTime)
{
spriteBatch.Begin();
spriteBatch.DrawString(font, "FPS " + ((int)FPS).ToString(), position, color, 0, origin, scale, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}
В большинстве случаев это работает нормально, но в последнее время у меня была проблема.
Когда я помещаю следующий код в метод обновления игры, странная вещь начинает происходить.
if (threadPath == null || threadPath.ThreadState != ThreadState.Running)
{
ThreadStart ts = new ThreadStart(current.PathFinder.FindPaths);
threadPath = new Thread(ts);
threadPath.Priority = ThreadPriority.Highest;
threadPath.Start();
}
Основная идея этого кода - постоянно запускать алгоритм pathFinding в разных потоках.
По странным вещам я имею в виду, что иногда FPS резко уменьшается, это очевидно, но отображаемые FPS меняются чаще, чем раз в секунду. Если я понимаю этот код, FPS не может меняться чаще, чем раз в секунду.
Может кто-нибудь объяснить мне, что происходит?
Изменить 26.03.2010
Я также разместил код метода Draw.
Изменить 31.03.2010 Ответы на вопросы Venesectrix
1) вы работаете с фиксированным или переменным шагом времени?
Для IsFixedTimeStep и SynchronizeWithVerticalRetrace установлено значение true.
2) Вы перемещали окно XNA, когда это произошло?
Нет
3) Сфокусировалось ли окно XNA?
Да
4) Насколько это было заметно (то есть, обновляясь так быстро, вы не можете его прочитать или просто обновляете больше секунды)?
Я смог прочитать обновления, FPS обновлял ~ 3 раза в секунду.
5) И все это происходит только с кодом потока?
Да