4

作業中の Windows Phone 7.5 アプリケーションでパフォーマンスの問題が発生しています。をListBox使用していると がVirtualizationMode="Recycling"ありDataTemplateます。パフォーマンスが悪いことを除けば、うまく機能しているようです。いくつかのパフォーマンス プロファイリングを行っているときに、リストをスクロールしているときに、CPU の 62% が使用され、DataTemplate. VirtualizationMode="Recycling"すべてを再利用し、UIElements新しいインスタンスを作成したり、古いインスタンスを破棄したりする必要がないことを理解していたListBoxので、これはまさに起こってはならないことだと思います。

関連する XAML は次のとおりです。

<ListBox ItemsSource="{Binding EpisodeRows}" toolkit:TiltEffect.SuppressTilt="True" Margin="12,0" VirtualizingStackPanel.VirtualizationMode="Recycling">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid VerticalAlignment="Top" Height="111" VirtualizingStackPanel.VirtualizationMode="Recycling" >
                <StackPanel Orientation="Horizontal" Visibility="{Binding TilesVisibility}">
                    <landerGame:LevelTileUserControl PartText="{Binding PartText_1}" ScoreText="{Binding ScoreText_1}" Star1Visibility="{Binding Star1Vi
                    <landerGame:LevelTileUserControl PartText="{Binding PartText_2}" ScoreText="{Binding ScoreText_2}" Star1Visibility="{Binding Star1Vi
                    <landerGame:LevelTileUserControl PartText="{Binding PartText_3}" ScoreText="{Binding ScoreText_3}" Star1Visibility="{Binding Star1Vi
                    <landerGame:LevelTileUserControl PartText="{Binding PartText_4}" ScoreText="{Binding ScoreText_4}" Star1Visibility="{Binding Star1Vi
                    <landerGame:LevelTileUserControl PartText="{Binding PartText_5}" ScoreText="{Binding ScoreText_5}" Star1Visibility="{Binding Star1Vi
                    <landerGame:LevelTileUserControl PartText="{Binding PartText_6}" ScoreText="{Binding ScoreText_6}" Star1Visibility="{Binding Star1Vi
                </StackPanel>
                <TextBlock VerticalAlignment="Top" Text="{Binding EpisodeTitleText}" Style="{StaticResource PhoneTextExtraLargeStyle}" Margin="0,0,0,5" 
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

リストをスクロールしている間のパフォーマンス プロファイリング結果のスクリーンショットを次に示します。 パフォーマンス プロファイリングの結果

リストは次のようになります (ゲームのレベル選択です)。 レベル選択

私は周りを見回して、VirtualizationMode="Recycling"うまくいかないように見える記事を見つけました。この時点で、どんな洞察も非常に高く評価されます。

編集:このプロジェクトに関連する完全なコードをアップロードしました。誰もがここで試してみたいと思っています: http://maketag.net/landerGame.rar

4

1 に答える 1

1

ユーザー コントロールに関する情報を提供していないため、これをテストするのは困難です。

ListBoxここでエミュレートしようとしている動作は実際にはWrapPanelであるため、 a から離れることをお勧めします。

各項目に非常に多くのユーザー コントロールを追加する方法ListBoxが原因で、パフォーマンス ヒットが発生していると推測されます。に切り替えてWrapPanelアイテムのコレクションにバインドすると、一度に 6 つのアイテムを仮想化しようとするのではなく、各アイテムが仮想化されるため、パフォーマンスが向上する可能性があります (これはおそらく機能していません)。

編集:コードを調べてみると、パフォーマンスを向上させるためにいくつかの変更を加えることができると思います。まず、 を取り除き、次のようにListBoxを使用します。ItemsControl

<controls:Pivot Title="LANDER GAME">
    <!--Pivot item one-->
    <controls:PivotItem Header="Episodes">
        <ScrollViewer>
            <ItemsControl ItemsSource="{Binding EpisodeRows}" toolkit:TiltEffect.SuppressTilt="True" Margin="12,0">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid VerticalAlignment="Top" Height="111" >
                            <StackPanel Orientation="Horizontal" Visibility="{Binding TilesVisibility}">
                                ...
                            </StackPanel>
                            <TextBlock VerticalAlignment="Top" Text="{Binding EpisodeTitleText}" Style="{StaticResource PhoneTextExtraLargeStyle}" Margin="0,0,0,5" Visibility="{Binding TitleVisibility}" />
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </controls:PivotItem>

私がすることは、ハードコードされた変数のタイプをPartText_1取り除くことです。アイテムのリストを作成し、他のアイテム コントロール内にPartText_2別のリストを作成するだけです。ItemsControl

を取り除くだけで、ListBoxはるかにスムーズになりました。また、最初はパフォーマンスが低下したため、 も削除しましたVirtualizingStackPanel.VirtualizationMode="Recycling"。ロードすると、よりスムーズに見えました。

于 2012-12-20T21:38:34.623 に答える