C# WPF动画FPS与CPU使用率-我是否期望过高?

C# WPF动画FPS与CPU使用率-我是否期望过高?,c#,.net,wpf,animation,screensaver,C#,.net,Wpf,Animation,Screensaver,为我妻子做屏幕保护程序,虽然我已经能够提高低端机器上的FPS,但CPU使用率似乎仍然很高 以下是我从几个5分钟采样周期中得出的一些数字: 在2.2GHz、3GB ram、NVIDIA Quadro NVS 140M(128MB)、Vista[我的开发笔记本电脑]的情况下,核心2 Duo T7500上的平均CPU约为60FPS 35% 奔腾D在3.4GHz、1.5GB ram、标准VGA图形适配器(未知)、2003服务器上的平均CPU约为40FPS 50%[糟糕的桌面] 我可以理解在蹩脚的桌面上较

为我妻子做屏幕保护程序,虽然我已经能够提高低端机器上的FPS,但CPU使用率似乎仍然很高

以下是我从几个5分钟采样周期中得出的一些数字:

在2.2GHz、3GB ram、NVIDIA Quadro NVS 140M(128MB)、Vista[我的开发笔记本电脑]的情况下,核心2 Duo T7500上的平均CPU约为60FPS 35%

奔腾D在3.4GHz、1.5GB ram、标准VGA图形适配器(未知)、2003服务器上的平均CPU约为40FPS 50%[糟糕的桌面]

我可以理解在蹩脚的桌面上较低的帧速率和较高的CPU使用率,但它似乎仍然很高,而在我的dev笔记本电脑上,35%的帧速率似乎也很高

我真的很想分析应用程序以获得更多细节,但我也有问题,所以我想知道我是否做错了什么(以前从未分析过WPF)

WPF性能套件:

进程启动错误

无法附加到进程: CCHearts.exe 你想杀了它吗

尝试启动后单击“取消”时出现此错误消息。如果我没有单击“取消”,它将处于空闲状态,我想它正在等待连接

性能浏览器:

无法启动C:\Projects2\CC.Hearts\CC.Hearts\bin\Debug(USEVISUAL)\CCHearts.exe。上次尝试分析应用程序失败。请重新启动应用程序

性能输出窗口:

开始分析。 分析过程ID 5360(CCHearts)。 进程ID 5360已退出。 数据写入C:\Projects2\CC.Hearts\CCHearts100608.vsp。 分析完成。 PRF0025:未收集任何数据。 分析完成

所以我一直想提高性能,但没有具体的方法来确定瓶颈在哪里。在这一点上投掷飞镖相对比较成功,但我现在已经超越了这一点:)


摘要:

到目前为止有很多进展

性能浏览器

问题:无法工作,错误消息模糊

解决方案:使用获取一条真正的错误消息,指出是赛门铁克dll阻止了我。设置以下注册表项修复了该问题:

[HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Services\SysPlant]

“开始”=dword:00000004

WPF性能套件

问题:不工作,没有错误消息

解决方案:使用为.NET 4设计的WPF性能套件,而不是Windows SDK 7的早期版本(我觉得很傻:-p)

WPF动画

问题:与FPS/感知到的工作负载相比,CPU使用率高


解决方案:这里和那里都有很多好的调整。但正如耶利米·莫里尔所指出的那样,这一巨大的进步。查看。

您不想过度优化。第一个需要回答的问题是,大多数屏幕保护程序的性能是什么

如果每件事情都需要50%的CPU,那么我就不会担心(我怀疑这是真的)。如果你想在盲目投掷飞镖之前保存最佳循环,请确保你真正了解WPF的3D方面

这里是最好的起点


我注意到Celeron 1.1Ghz上也有类似的稳定高CPU使用率(~95%),但我从未注意到打开动画会导致性能下降。我从未量化FPS,尽管我怀疑它相当低。我的印象是WPF遵循一种机会主义的资源利用策略,尽其所能获得最好的质量,但不会干扰其他处理。如果您将CPU与其他任务一起加载,我怀疑与图形相关的CPU使用率会相应下降。

我下载了您的代码,在我的四核2.6ghz上看到约20-28%的CPU使用率。通过添加缓存合成,我能够将其降低到约6-8%的CPU

我使用“DEBUG”而不是“DEBUG(USEVISUAL)”进行编译,并在Heart.xaml中将BitmapCache添加到路径:


Path CacheMode=“BitmapCache”…

在分辨率为1920x1200的Core 2 Duo E6600/GeForce 8800GT(均为3岁)上,您的屏幕保护程序以60 FPS的速度平稳运行,平均CPU使用率为10-15%。我不会太麻烦的。尝试设置
RenderOptions.CachingHint
以缓存在您的心上,因为您使用的是WPF 4。感谢您查看,很高兴知道它在另一台机器上运行良好。我试图从中挤出更多性能的主要原因是,它会启动上面提到的“蹩脚桌面”上的二次冷却风扇。对于设计为在PC空闲时运行的应用程序来说,这似乎是过度的功耗。无论哪种方式,我都很想弄清楚是什么阻碍了我的分析。这是一个很好的第一个问题,我不知道如何量化。在上面提到的“烂桌面”上,当我的屏幕保护程序运行时,二次冷却就开始了。这不会发生在我之前写的任何Windows屏幕保护程序或WinForms屏幕保护程序中。非常有趣。我得调查一下。我放弃了Heart.xaml用于DrawingVisual,因为它据说重量更轻,但渲染似乎花费了很多时间(~25%)。我一定要看看这个。非常感谢您抽出时间来研究这个问题。没问题。我不确定如何让BitmapCache在DrawingVisual上工作,因为CacheMode=new BitmapCache()似乎没有效果。我会检查一下WPF的缓存合成功能,因为它们极大地提高了性能。我忘了提到你就是那个人:-)。再次感谢您为我指点缓存作文。我们走吧。。。在
FrameworkElement
中托管我的
DrawingVisual
,然后我可以在
FrameworkElement
上设置
CacheMode
,我有一个“轻量级”缓存
DrawingVisual
。再次感谢你为我指明了正确的方向。