WPF表现为屏幕上的大量元素

Mar*_*ark 3 wpf performance

我目前正在尝试在WPF中创建一个场景,我的屏幕上有大约250个控件,用户可以使用鼠标平移和放大这些控件.

我在应用程序上运行了WPF Performance Suite工具,当屏幕上有大量这些控件时(即当用户缩小时),FPS下降到15左右,这不是很好.

以下是XAML的基本概要:

<Window>
  <Window.Resources>
    <ControlTemplate x:Key="LandTemplate" TargetType="{x:Type local:LandControl}">
        <Canvas>
            <Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="1" Width="55.5" Height="74.687" Data="M0.5,0.5 L55,0.5 L55,74.187 L0.5,74.187 z"/>
            <Canvas x:Name="DetailLevelCanvas" Width="24.5" Height="21" Canvas.Left="15.306" Canvas.Top="23.972">
                <TextBlock Width="21" Height="14" Text="712" TextWrapping="Wrap" Foreground="Black"/>
                <TextBlock Width="17.5" Height="7" Canvas.Left="7" Canvas.Top="14" Text="614m2" TextWrapping="Wrap" FontSize="5.333" Foreground="Black"/>
            </Canvas>
        </Canvas>
    </ControlTemplate>
  </Window.Resources>

  ...
  <local:LandControl Width="55.5" Height="74.552" Canvas.Top="xxx" Template=" {StaticResource LandTemplate}" RenderTransformOrigin="0.5,0.5" Canvas.Left="xxx">
  <local:LandControl Width="55.5" Height="74.552" Canvas.Top="xxx" Template=" {StaticResource LandTemplate}" RenderTransformOrigin="0.5,0.5" Canvas.Left="xxx">
  <local:LandControl Width="55.5" Height="74.552" Canvas.Top="xxx" Template=" {StaticResource LandTemplate}" RenderTransformOrigin="0.5,0.5" Canvas.Left="xxx">
  <local:LandControl Width="55.5" Height="74.552" Canvas.Top="xxx" Template=" {StaticResource LandTemplate}" RenderTransformOrigin="0.5,0.5" Canvas.Left="xxx">
  ... and so on...
</Window>
Run Code Online (Sandbox Code Playgroud)

我试图最小化控件模板中的细节,我甚至做了大量的查找和替换控件,只是将他们的原始元素内联而不是使用模板,但没有明显的性能改进.

我已经看到了其他有关这方面的问题,人们说要做自定义绘图,但是当我不得不像我一样放大和平移时,我真的不明白这是多么有意义.

如果有人可以在这里帮忙,那就太好了!

标记

ada*_*ill 10

这可能听起来很陈腐但是 - 没有免费的午餐.

过去两年我一直在研究这个问题.该产品由4个浏览器组成,其接口主要是ZUI.除了Atlas以外,所有人都使用Visual来进行图形渲染,并且有很多经验教训和一些后续工作.

1)FrameworkElements不是你的朋友.现代GFX卡和CPU上的FE引擎最大约为500-600个元素,但这取决于它们的复杂性.FE的重量是Visuals的10倍.

2)文字会显着影响你的帧率.渲染曲线很昂贵有关使用动画文本的提示,请参阅Robby Ingebretsens帖子

3)剔除很重要,但是从VisualTree中添加/删除是很昂贵的.折叠/隐藏是一种妥协.

4)在WPF 3.5中你有两个选择 - 编程到Visuals图层或使用像Planerator这样的东西然后操作相机进行平移和缩放,但它需要你的用户有一个很好的gfx卡.

5)在WPF 4.0中,由于称为缓存组合的东西,事情要好得多.它的工作原理与Planerator的工作原理相同.GFX卡将控件渲染为位图,并平移缩放位图.

在4,0中使用它很容易 - .CacheMode为最昂贵的FrameworkElements 安装,事情会快得多.您还可以控制文本消除锯齿的方式以及位图重新生成的比例(EnableClearTypeRenderAtScale)

在我的Atlas浏览器中,我可以显示超过700条文本+简单的矩形,而不会失去平移和缩放的交互性.在4之前,地图无法使用.

获得更好的交互性能需要时间,目标和测量.祝好运.

凯尔罗文具有优良的系列上ZoomableCanvas他正在文章.它使用Quadtree和PriorityQueue实现,并允许您实现语义缩放.

更新:8-07-10添加了文本提示和ZoomableCanvas链接