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

dav*_*ons 5 .net wpf performance frame-rate render

我有一种在 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
}
Run Code Online (Sandbox Code Playgroud)

这些计算显示我的帧速率约为 40-60 FPS

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

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

我可以依靠什么?

我知道 UI 线程和渲染线程之间存在差异,因此真正的 FPS 应该在渲染线程上测量?但我怎样才能抓住它呢?

提前致谢!

b.p*_*ell 1

晚了很多年,但为了子孙后代,我想我会分享。CompositionTarget_Rendering当其他事件没有发生时,WPF 将减少调用的数量。解决这个问题的一种(hacky)方法是在屏幕上运行持续的动画。我使用了一个带有重复动画的 1x1 矩形(它必须位于可见表面上的某个位置,如果您将其放在屏幕之外,WPF 足够聪明,可以忽略它)。这具有在我测试过的每个工作站上保持合成目标至少以 59-60fps 运行的效果(在您的示例中,您已经考虑了另一个问题,即它可以运行超过 60fps) 。