Я измеряю время между кадрами в простой анимации WPF. Перфоратор говорит, что приложение работает со скоростью ~ 60 кадров в секунду, поэтому я ожидал, что время между кадрами будет ~ 16,6 мс с небольшим отклонением.
public MainWindow()
{
...
CompositionTarget.Rendering += Rendering;
}
List<long> FrameDurations = new List<long>();
private long PreviousFrameTime = 0;
private void Rendering(object o, EventArgs args)
{
FrameDurations.Add(DateTime.Now.Ticks - PreviousFrameTime);
PreviousFrameTime = DateTime.Now.Ticks;
}
Меня удивили две вещи:
- Время между кадрами довольно нерегулярно
- Время между кадрами составляет ~ 8 мс. Я ожидал, что частота обновления монитора установит более низкую границу времени между кадрами (т.е. 60 Гц = 16,6 мс между каждым фреймом и что-то быстрее бессмысленно).
Y - время между кадрами в тиках (10 000 тиков = 1 мс)
X - количество кадров
Возможные смешающие факторы
- Неточность таймера
- Если CompositionTarget.Rendering фактически не коррелирует с рисунком одного кадра
Проект, который я использую: SimpleWindow.zip
=== Edit
Маркус указал, что я могу использовать RenderingEventArgs.RenderingTime.Ticks вместо DateTime.Now.Ticks. Я повторил пробег и получил очень разные результаты. Единственное различие заключается в методе синхронизации:
DateTime.Now.Ticks
RenderingEventArgs.RenderingTime.Ticks
Данные из RenderingEventArgs значительно улучшают данные 16,6 мс/фрейм, и это согласовано.
- Я не уверен, почему DateTime.Now и RenderingEventArgs будут создавать такие очень разные данные.
- Предполагая, что RenderingEventArgs производит правильные времена, он все еще немного сбивает с толку, что эти времена не являются ожидаемыми 16.6ms.
Если дисплей обновляется каждые 16,6 мс, а WPF обновляется каждые 14,9 мс, мы можем ожидать состояние гонки, которое приведет к разрыву. То есть примерно каждый 10-й кадр WPF будет пытаться записать свое изображение, пока дисплей пытается прочитать изображение.