Я выполняю настройку производительности в игре 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 : Почему длительность раскадровки так несовместима между сериями?