.net - 在 WPF .Net 中测量 UI 性能的正确方法

标签 .net wpf performance render frame-rate

我有一种在 WPF 中测量 FPS 的方法(我真的不知道它是否是正确的测量方法)。

CompositionTarget.Rendering += CompositionTarger_Rendering;

void CompositionTarget_Rendering(object sender, EventArgs e)
{
    var args = (RenderingEventArgs)e;
    if(args.RenderingTime == m_Last)
    {
        return;
    }
    m_Last = args.RenderingTime;

    DoingFpsCalculations(); // This method adds to a counter and reports each elapsed second what the counter is => FPS
}

这些计算表明我有大约 40-60 FPS

然而,有时我可以直观地看到,事实并非如此。 FPS 计数器报告可以说是 50FPS,但 UI 绝对会以较低的 FPS 进行更新。

例如,我有一个以 15Hz 运行的 DispatcherTimer,计时器调用渲染方法并更新绑定(bind)到其 RenderTransform 的 ui 元素的转换。计时器以 15Hz 的频率被调用并及时完成计算。 FPS 显示 40-60 fps,但 UI 元素绝对更新仅以 4-6 FPS 为例。

我可以依靠什么?

我知道 UI 线程和渲染线程之间存在差异,所以真正的 FPS 应该在渲染线程上测量?但我该如何掌握它呢?

提前致谢!

最佳答案

晚了很多年,但为了子孙后代,我想我会分享。当其他事件未发生时,WPF 将减少调用 CompositionTarget_Rendering 的数量。解决此问题的一种(hacky)方法是在屏幕上运行恒定的动画。我已经使用了一个 1x1 的矩形,它有一个重复的双动画(它必须在可见表面的某个地方,如果你把它从屏幕上移开,WPF 足够聪明,可以忽略它)。这具有使组合目标在我测试过的每个工作站上以至少 59-60fps 的速度运行的效果(在您的示例中,您已经考虑了另一个问题,即它可以运行超过 60fps 的事实) .

关于.net - 在 WPF .Net 中测量 UI 性能的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39098210/

相关文章:

WPF Scale Transform 和 ScrollViewer - 缩放时无法滚动超出原始大小

wpf - 在 Windows Vista/7 上的 APPDATA 中创建文件夹

java - 从 PaintComponent 调用 repaint 是一个好习惯吗

mysql - 如何提高 MySQL DB 的 InnoDB 每秒写入速度

c# - 在日历日打开文本框单击

c# - 为什么在通过反射更改静态只读字段后,该只读字段的输出是旧的?

c# - 如何重新查询单个 RoutedCommand 的 'CanExecute'?

.net - 客户端证书 : Could not establish secure channel for SSL/TLS with authority (Again! )

wpf - <ListBox.Resources> 或 <ListBox.ItemContainerStyle> 中的 ListBoxItem 样式?

performance - Haskell 中的高效数字读取