Непоследовательная производительность раскадровки в эмуляторе - PullRequest
1 голос
/ 08 ноября 2010

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

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

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

var sw = new Stopwatch();

var animation = new Storyboard();
animation.Duration = TimeSpan.FromMilliseconds(10);
animation.Completed += (s, e) =>
{
    sw.Stop();
    Debug.WriteLine(sw.ElapsedMilliseconds.ToString());
    sw.Reset();
    sw.Start();
    animation.Begin();
};

animation.Begin();

Вывод, который я ожидаю (в идеале), выглядит примерно так:

10
10
10
10
...

но вместо этого вот что я получаю:

12
15
16
17
17
14
10
10
10
9
11
132
10
20
11
11
10
12

Время между циклами варьируется довольно незначительно, но наиболее важно, что случаются очень длительные задержки (например, 132 выше). Это происходит независимо от продолжительности анимации, то есть фактическая продолжительность «центрирована» по отношению к установленной продолжительности, но сильно варьируется с периодическими большими задержками.

Вы можете себе представить, что моя игра работает нерегулярно, совсем не гладко и не равномерно. Также я заметил, что независимо от того, насколько проста операция рендеринга, я не могу превышать ~ 42 FPS.

Вопрос 1 : Я совершаю очевидную и вопиющую ошибку? Мой подход некорректен?

Вопрос 2 : Почему длительность раскадровки так несовместима между сериями?

1 Ответ

2 голосов
/ 09 ноября 2010

Я на 90% уверен, что это вызвано эмулятором, но помните, что 10 мс - очень короткий интервал. Приложение Silverlight обновляется 60 раз в секунду, поэтому оно составляет 16,6 мс. Я рекомендую установить его на 33 мс или более.

В одной из моих игр я использую DispatcherTimer, который отлично работает (для падающих бомб :)), но не так точно, как я думал. Использование раскадровки в качестве таймера лучше IMO. В принципе, если у вас нет других сложных анимаций, поток композитора работает плавно, а ваш таймер довольно точный.

Как человек с устройством для проверки вашего кода (или покупки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...