WPF实现图中效果占用CPU资源过高,求解决方案

qq_28945767 2016-12-07 02:26:36
前言:当窗体上生成批量任意控件(如:2万个Label),然后执行Storyboard动画,或操作窗体控件属性(如:Marin,RenderTransform)此时观察CPU使用率高达20%或更高,当窗体无任何控件时,执行上述内容CPU使用率正常为1%,根据上述情况我个人理解是由于重绘窗体内容过大导致的,不知道理解是否正确。
(曾经在以上场景做过测试,定义DispatcherTimer每隔一秒获取ProgressBar.Maximum属性此时观察CPU使用率高达20%或更高,持久不降,曾经以为是生成控件未缓过来,后来隔了一天后观察还是未降低)
*
测试场景结果:

实现以下功能采用上述方案行不通,导致CPU长期负荷,谁有好的方案给下意见谢谢:
...全文
3568 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotmee 2017-12-22
  • 打赏
  • 举报
回复
使用VS 诊断工具查看暂用率搞得原因。我的代码暂用率高是因为 每30ms 写一次文件导致CPU 暂用率高。
xinweilee 2016-12-08
  • 打赏
  • 举报
回复
不知道你怎么布局的,怀疑是动画执行期间导致界面在持续进行重新布局的缘故 说下我的想法,image(动画控件)和2万个label放在不同容器中,动画控件所在容器固定大小 如<Grid> <Grid.RowDefinitions> <RowDefinition height = 100/> <RowDefinition height =* /> </Grid.RowDefinition> <iamge grid.row=0 Storyboard=.../> <StackPanel grid.row=1> <!--2万个label--> </StackPanel> </Grid>
qq_28945767 2016-12-08
  • 打赏
  • 举报
回复
引用 6 楼 xinweilee 的回复:
如果cpu一直不降,估计是你程序里有很多的动画吧 你可以不加动画测试一下
目前只有一个图片旋转动画,如果单纯添加2万个Label,CUP上升到20%持续到控件创建完成后恢复正常,如果只有图片旋转CPU则长期为0-1%,如果创建2万个Label再使用动画旋转则长期20%以上。 上述问题提过不单使用动画会这样,定义DispatcherTimer每隔一秒操作窗体控件属性(如:Marin,RenderTransform)都会产生类似效果
qq_28945767 2016-12-08
  • 打赏
  • 举报
回复
引用 17 楼 D56233577 的回复:
[quote=引用 16 楼 qq_28945767 的回复:] 换成这种方法CPU上到40%
TextBlock占用资源远低于Label,你代码肯定有问题。 XAML和CS贴出来,别搞什么截图。[/quote] 不好意思,刚刚没用ListBox,现在使用ListBox正常了,非常感谢
D56233577 2016-12-08
  • 打赏
  • 举报
回复
引用 16 楼 qq_28945767 的回复:
换成这种方法CPU上到40%
TextBlock占用资源远低于Label,你代码肯定有问题。 XAML和CS贴出来,别搞什么截图。
qq_28945767 2016-12-08
  • 打赏
  • 举报
回复
引用 14 楼 D56233577 的回复:
[quote=引用 13 楼 qq_28945767 的回复:] 上面有例子截图。
好吧,看了一下。 首先不应该用Panel,其次不应该用Label,应该尝试用ListBox和Textblock。[/quote] 换成这种方法CPU上到40%
xinweilee 2016-12-08
  • 打赏
  • 举报
回复
引用 14 楼 D56233577 的回复:
[quote=引用 13 楼 qq_28945767 的回复:] 上面有例子截图。
好吧,看了一下。 首先不应该用Panel,其次不应该用Label,应该尝试用ListBox和Textblock。[/quote] ListBox或ListView是正解,因为itemscontrol底层做了虚拟化的处理,另外大数据量的情况下,通过绑定的方式处理比较好
D56233577 2016-12-08
  • 打赏
  • 举报
回复
引用 13 楼 qq_28945767 的回复:
上面有例子截图。
好吧,看了一下。 首先不应该用Panel,其次不应该用Label,应该尝试用ListBox和Textblock。
qq_28945767 2016-12-08
  • 打赏
  • 举报
回复
引用 12 楼 D56233577 的回复:
[quote=引用 11 楼 qq_28945767 的回复:] [quote=引用 10 楼 D56233577 的回复:] 我写10万个Label和动画都没见CPU超过3%
可以发个例子观摩一下?谢谢。[/quote] 你简单做一个占用高CPU的Demo,可以帮你看一下。[/quote] 上面有例子截图。
D56233577 2016-12-08
  • 打赏
  • 举报
回复
引用 11 楼 qq_28945767 的回复:
[quote=引用 10 楼 D56233577 的回复:] 我写10万个Label和动画都没见CPU超过3%
可以发个例子观摩一下?谢谢。[/quote] 你简单做一个占用高CPU的Demo,可以帮你看一下。
qq_28945767 2016-12-08
  • 打赏
  • 举报
回复
引用 10 楼 D56233577 的回复:
我写10万个Label和动画都没见CPU超过3%
可以发个例子观摩一下?谢谢。
D56233577 2016-12-08
  • 打赏
  • 举报
回复
我写10万个Label和动画都没见CPU超过3%
qq_28945767 2016-12-08
  • 打赏
  • 举报
回复
引用 8 楼 xinweilee 的回复:
不知道你怎么布局的,怀疑是动画执行期间导致界面在持续进行重新布局的缘故 说下我的想法,image(动画控件)和2万个label放在不同容器中,动画控件所在容器固定大小 如<Grid> <Grid.RowDefinitions> <RowDefinition height = 100/> <RowDefinition height =* /> </Grid.RowDefinition> <iamge grid.row=0 Storyboard=.../> <StackPanel grid.row=1> <!--2万个label--> </StackPanel> </Grid>
你这种写法是不行的,我使用的也是你这样布局。我曾经试过把2万个label放到自定义控件上,然后把此控件嵌套到窗体上,一样会产生类似效果。 当我2万个label和动画旋转独立放到一个空白窗体上(即2个窗体一个装载动画,一个装载lable),此时就正常了,所以根据上述情况我个人理解是由于重绘窗体内容过大导致的,不知道理解是否正确。如果非要实现此类效果,不知如何处理啊。
xinweilee 2016-12-07
  • 打赏
  • 举报
回复
如果cpu一直不降,估计是你程序里有很多的动画吧
你可以不加动画测试一下
qq_28945767 2016-12-07
  • 打赏
  • 举报
回复
引用 4 楼 xinweilee 的回复:
[quote=引用 3 楼 xinweilee 的回复:] <StackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"> </StackPanel>试一下
或者直接用VirtualizingStackPanel[/quote] 刚刚试了一下此方法,没有变化。
xinweilee 2016-12-07
  • 打赏
  • 举报
回复
引用 3 楼 xinweilee 的回复:
<StackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"> </StackPanel>试一下
或者直接用VirtualizingStackPanel
xinweilee 2016-12-07
  • 打赏
  • 举报
回复
<StackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"> </StackPanel>试一下
qq_28945767 2016-12-07
  • 打赏
  • 举报
回复
我只是说CPU长期占用高,我没说卡,两万个Label只是测试。
生成1000个图中歌曲列表,只有1000个控件能搞定?
D56233577 2016-12-07
  • 打赏
  • 举报
回复
就你截图上这点东西根本不会卡,也没看到哪里用得着两万个Label。 如果确实要显示这么多,卡也不稀奇。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧