XNA Platformer (2D) - колебания частоты кадров / FPS - PullRequest
5 голосов
/ 23 февраля 2011

Я новичок в C Sharp и пишу игру с XNA Framework. Я создал проект, который является сильно модифицированной версией стартового набора XNA "Platformer".

Я вижу (казалось бы) случайные колебания с частотой кадров. Иногда он будет работать со скоростью 60 FPS все время, иногда он будет начинаться с 60 FPS, затем упадет до 49-52, а в других случаях он сразу упадет до 49-52. Использование Fraps для отображения частоты кадров (без записи видео на диск).

Уникальная природа этой игры требует, чтобы она работала со скоростью 60 кадров в секунду.

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

Это колебание происходит на моем настольном компьютере и ноутбуке с одинаковой частотой, поэтому это не проблема с аппаратным, антивирусным и т. Д.

Я искал, как блокировать частоту кадров в XNA, и мой код, кажется, выполняет большую часть того, что ему нужно, включая попытку ограничить скорость до 60 FPS (используя IsFixedTimeStep, SynchronizeWithVerticalRetrace).

Игра абсолютно способна к 60 FPS от начала до конца, я вижу это все время. Насколько я могу судить, когда он работает на скорости 60 FPS, он не обременяет процессор, оперативную память или любые другие ресурсы.

Кто-нибудь еще испытал это?

Спасибо, - S

Ответы [ 7 ]

2 голосов
/ 23 февраля 2011

Несоответствие, которое вы описываете, означает, что проблема вызвана

  • Фактором окружающей среды, таким как другой процесс;или
  • Путь кода в вашей игре, который не используется при каждом запуске

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

Закройте все несущественные процессы, такие как медиаплееры.Windows Media Player и iTunes могут снизить частоту кадров во время воспроизведения.С Fraps должно быть все в порядке, пока он не записывает, но я бы реализовал ваш собственный встроенный дисплей FPS, чтобы быть уверенным.

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

Другие вещи, которые вы можете попытаться сузить, связаны с окружающей средой:

  • Определитьесли игра работает со скоростью 60 кадров в секунду после чистой перезагрузки
  • Определите, будет ли игра всегда работать со скоростью 60 кадров в секунду при первом запуске
  • Запустите игру из проводника вместо визуальной студии
  • Определитеесли запуск в режиме Release или Debug оказывает какое-либо влияние
  • Запустите игру на компьютере друга

Если причина кроется в пути кода внутри вашей игры, который не выполняется на каждомзапустить вы можете:

  • несколько раз играть и попытаться определить, что именно вы делаете в игре, которая вызывает замедление.
  • внедрите систему записи и воспроизведения ввода, чтобы точно повторять один и тот же прогон через игру
  • профилировать сборку мусора и общую производительность для поиска любых проблем, которые выделяются
1 голос
/ 22 июля 2011

У меня была точно такая же проблема.Я создал игру, основанную на стартовом наборе Platformer, и использую Windows 7. В большинстве случаев программа работает нормально при 60 FPS, но иногда она падает до 52 FPS в течение примерно 30 секунд, а затем запускаетсявернуться к 60 FPS.

Я обнаружил, что, отключив функции Windows 7 Aero, моя игра теперь постоянно поддерживает скорость 60 FPS.Мне пришлось переключиться на тему Windows 7 Basic без Aero, и теперь игра работает хорошо и гладко.

1 голос
/ 23 февраля 2011

Я бы проверил, совпадают ли эти периодические замедления с событиями GC, особенно поколений 1 или 2. Из того, что вы описываете, это кажется вполне вероятным.Если это так, посмотрите, можете ли вы уменьшить отток объектов в своем коде с помощью повторного использования, выделения стека и т. Д.

0 голосов
/ 04 марта 2011

Вы никогда не сможете заставить игру работать со скоростью 60 кадров в секунду.

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

0 голосов
/ 04 марта 2011

Вы рисуете что-нибудь за пределами видимой области?У меня была такая же проблема (частота кадров внезапно упала).Попробовав все, оказалось, что я иногда рисую вещи за пределами видимой области или на полпути между видимой и невидимой областями экрана.Учитывая, что вы используете стартовый комплект платформера, это, вероятно, и ваша проблема.

0 голосов
/ 24 февраля 2011

Попробуйте отключить V sync SynchronizeWithVerticalRetrace=false и посмотрите, поможет ли это. У V sync есть неприятный побочный эффект - резко снижается частота кадров, если событие происходит во время синхронизации или если кадр слишком длинный для рендеринга, так как ему придется ждать следующей синхронизации. Тем не менее, вы, вероятно, будете испытывать разрыв. Однако, если стабильность частоты кадров важнее, чем отображение без разрывов, это может быть хорошим компромиссом.

0 голосов
/ 24 февраля 2011

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

Вы пытались разрешить игре запускаться с максимальной частотой кадров?Если так, вы все еще получаете огромные падения частоты кадров?Если вы не знаете, как это сделать, я могу выложить код, когда вернусь домой, если вам это нужно.

...