Измерение производительности приложений Silverlight / Moonlight

#silverlight #performance #moonlight

#silverlight #Производительность #moonlight

Вопрос:

Меня интересует измерение производительности Silverlight на высоком уровне, особенно по сравнению с Moonlight. Я просмотрел и придумал некоторые инструменты (SilverliightSpy среди прочих), но для этого должны быть другие инструменты или способы.

Вопросы высокого уровня, которые я хотел бы исследовать, это

  • Как moonlight и silverlight сравнивают производительность wrt
  • Как я должен спроектировать свое приложение, чтобы получить максимальную производительность (на SL, ML или обоих)

Меня интересуют следующие характеристики производительности

  • Как мое тестовое приложение использует процессор (грубое сравнение) — т. Е. работает ли оно без нагрузки на графический процессор
  • Время рендеринга. Не только FPS, но и латентность — «если я изменю свойства какого-либо визуального элемента …»
    • «… через какое время они будут обновлены на экране»
    • «… сколько используется ЦП за это время»

Есть предложения? Было бы неплохо иметь возможность делать это в приложении, чтобы я мог просто запустить приложение на Silverlight, а затем на Moonlight и сравнить его результаты. Кроссплатформенный профилировщик также мог бы работать.

Ответ №1:

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

Для расчета загрузки процессора внутри вашего приложения вы можете использовать класс Analytics. Чтобы вычислить частоту кадров, просто подключитесь к статическому событию рендеринга класса CompositionTarget.

 private DispatcherTimer fpsTimer = new DispatcherTimer();
private DateTime lastFpsUpdate;
private Analytics analyzer = new System.Windows.Analytics();
private int frameCount;

public MyClass()
{
    fpsTimer.Interval = TimeSpan.FromSeconds(1);
    fpsTimer.Tick  = new EventHandler(fpsTimer_Tick);
    fpsTimer.Start();
    lastFpsUpdate = DateTime.Now;
    CompositionTarget.Rendering  = new EventHandler(CompositionTarget_Rendering);
}

// Called every second
void fpsTimer_Tick(object sender, EventArgs e)
{
    double framerate = 0;
    framerate = frameCount / (DateTime.Now - lastFpsUpdate).TotalSeconds;
    c_statusMessage.Text = String.Format("Framerate: {0:0} fps, CPU utilization: {1:0.0}%", framerate, analyzer.AverageProcessLoad);
    lastFpsUpdate = DateTime.Now;
    frameCount = 0;
}

// Called by the framework on every frame
void CompositionTarget_Rendering(object sender, EventArgs e)
{
    frameCount  ;
}