2015-06-27 75 views
1

我有2级的深度集合,我把它渲染成像Header,Child Item一样的东西。如何进一步优化Windows Store应用程序?

粗略地说,我的代码看起来是这样的:

<ScrollViewer> 
     <ItemsControl IsEnabled="{Binding Path=IsEnabled}" 
         ItemsSource="{Binding Path=HeaderViewModels, Mode=OneTime}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemsTemplate> 
       <DataTemplate> 
        <StackPanel Visibility="{Binding Path=ShouldShow, Converter={StaticResource SomeConverter}}"> 
         <TextBlock Text="{Binding Path=Description, Mode=OneTime}" /> 
         <ItemsControl ItemsPanel="{StaticResource WinRTXAMLWrapPanel}" 
             ItemsSource="{Binding Path=ChildViewModels, Mode=OneTime}"> 
          <i:Interaction.Behaviors> 
           <SomeClass:AdjustSizeBehavior SizeFromParentMode="Height" /> 
          </i:Interaction.Behaviors> 
          <ItemsControl.ItemsTemplate> 
           <DataTemplate> 
           <ContentControl> 
            <i:Interaction.Behaviors> 
             <SomeClass:IsEnabledBehavior /> 
             <SomeClass:PointerPressBehavior /> 
             <SomeClass:PointerLeaveBehavior /> 
            </i:Interaction.Behaviors> 
            <StackPanel> 
             <TextBlock Text="X"> 
              <i:Interaction.Behaviors> 
               <SomeClass:SetXMarkColor /> 
              </i:Interaction.Behaviors> 
             </TextBlock> 
             <TextBlock Text="{Binding Path=Description, Mode=OneTime}" /> 
            </StackPanel> 
           </ContentControl> 
           </DataTemplate> 
          </ItemsControl.ItemsTemplate> 
         </ItemsControl> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemsTemplate> 
     </ItemsControl> 
    </ScrollViewer> 

冷落的造型,但其相当多的背景下,利润,字体大小等。此外,你可以看到我使用大量的绑定和行为。

我已经做了大部分我能想到的优化。删除了不必要的UI元素(例如用于“背景”的矩形),使用StackPanel而不是Grid,将列/高度设置为静态而不是自动。基本上做什么,我可以在此链接:Twelve ways to improve wpf performanceBest practices for Windows Store Apps

随着我也做了优化,其实我已经减少了10头+ 8的孩子每个(共80个)的加载时间,从1.8秒到大约0.5毫秒 - 0.6毫秒。

但是,我希望它达到小于0.5毫秒,所以它就像'即时'。

有什么我可以做的,以提高性能?

谢谢!

+0

使用一个分析器,看看哪些东西仍然需要花费时间并将精力集中在那里。 –

+0

谢谢,是的,为了优化它,我使用了VS 2013 profiler和Windows Performance Recorder。注意到大部分处理都是关于UI元素的,所以在那里努力减少它,但现在我正在寻找其他可能性。 – Water

回答

1

它看起来像你的XAML很干净。你的C#代码呢?

如果您使用async/await,并将任务推送到后台线程,它可以真正提高性能。异步/等待是创建快速响应应用程序的秘诀。

Visual Studio 2015在识别和修复WPF性能瓶颈方面有了一些很大的改进。

您可以确定哪些代码行花费最长时间,因此可以使用异步分析器使用async/await推送到后台线程。分析器非常棒:它显示了编辑器中每个块或每行代码所花费的时间(以毫秒为单位)。

更多:

虽然我们是在它,如果微软实现编译WPF时间绑定,这将显着提高性能。绑定速度可以快10倍,因为它不再基于反射。添加您的投票在这里实现此功能:https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/7810488-implement-x-bind-for-wpf

+1

谢谢,看起来不错。我在C#代码上做了一些秒表基准测试,看起来很快,但我会仔细检查。如果有的话,我会继续尝试优化UI元素。你认为行为/绑定对性能有多大影响? – Water

+1

我注意到我的CPU使用率有点奇怪......它说“外部代码”,并且当我展开时,扩展项目最多只能添加50%。另外50%是“CPU Self”。有什么方法可以确定这是什么? – Water

+0

也许这是WPF渲染引擎花费的时间? – Contango

1

是否不使用使用主/从电网的问题是一个有趣的相关的问题。我正在和一位自2006年发布以来一直在使用WPF的开发者聊天。他是一位大师,他认为主/细节网格并不总是从可用性和速度两方面来看最好的东西看法。原因是你几乎总是在启动时加载所有的细节,这很慢,除非你在后台使用一些有趣的技巧来延迟加载。如果你扩展了一些细节网格,屏幕开始看起来很混乱。

它几乎就像主/细网格是可能的,但它们通常不是一个好主意。看看使用主/细网格的成功,可用的软件。除了Windows资源管理器风格的界面之外,它们在进化方面比较少见。它们在苹果地区并不常见,这暗示它们从用户角度来看可能不是最佳选择。

而真正奇怪的是,相对有经验的程序员往往喜欢master/detail网格 - 很多。他们似乎对程序员有直观的吸引力,因为他们对数据建模得很好。但从用户的角度来看,他们宁愿有一个快速加载的扁平网格,以及总是显示我们选择的当前行的详细信息的网格下面的一个Properties面板。

是的,这个答案没有解决你确切的问题 - 这太过于哲学 - 但它肯定会在一个整洁的重构中解决你的速度问题,并可能让你的应用程序更直观的为你的用户。

+0

很有洞察力,谢谢! – Water