我有一种在 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/