2015-06-27 71 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

相關問題