3

パフォーマンス上の理由から itemRendererFunction を避けるべきだとどこかで聞いたり読んだりしたことがありますが、そのコメントのソースが見つからないということは、代わりに非効率的なドキュメントのサンプルコードである可能性がありますか? はるかに効率的だと思われる別のコード例を作成しました (テストは行っていません)。

ドキュメントのコード例を次に示します。各反復で、新しいクラス ファクトリが作成されることに注意してください[1]。

<fx:Script>
    <![CDATA[

        import myComponents.MySimpleItemRendererFunction;
        import spark.skins.spark.DefaultItemRenderer;

        private function selectRenderer(item:Object):ClassFactory {
            var classFactory:ClassFactory;
            if (item is String) {
                // If the item is a String, use DefaultItemRenderer.
                classFactory = new ClassFactory(DefaultItemRenderer);
            }
            else {
                // If the item is an Object, use MySimpleItemRendererFunction.
                classFactory = new ClassFactory(MySimpleItemRendererFunction); 
            }
            return classFactory;
        }
    ]]>  
</fx:Script>

私のコード(テストされていません):

<fx:Script>
    <![CDATA[


        private var normalItemRendererFactory:ClassFactory = new ClassFactory(DefaultItemRenderer);
        private var editableItemRendererFactory:ClassFactory = new ClassFactory(EditableItemRenderer);

        private function itemRendererFunction(item:Object):ClassFactory {

            if (item is String) {
                // If the item is a String, use DefaultItemRenderer.
                return normalItemRendererFactory;
            }
            else {
                // If the item is an Object, use MySimpleItemRendererFunction.
                return editableItemRendererFactory;
            }
        }
    ]]>  
</fx:Script>

[1] http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS03d33b8076db57b9-23c04461124bbeca597-8000.html#WS94F31173-40D5-4ddd-B7B3-17D02BD57EAF

4

1 に答える 1

4

itemRendererFunctionFlex 4.0 から 4.5 SDK でを使用した場合、 のアイテム レンダラーListはリサイクルされません。これは、リストのスクロール パフォーマンスに大きな影響を与える可能性があります。

Flex 4.6 では、アイテム レンダラー関数を使用するときにアイテム レンダラーをリサイクルできるように機能が改善されました。

上記の例に加えた改善により、頭に釘を打ちました。最初の明らかな改善点は、毎回新しいクラス ファクトリを作成する必要がなくなったことです。しかし、さらに重要なことがあります。これにより、リストがレンダラーをリサイクルできなくなります (Flex 4.6 でも)。

itemRendererFunction毎回新しいクラス ファクトリを返すと、アイテム レンダラーのリストの内部追跡が台無しになり、リストが可能な限り再利用するのではなく、新しいレンダラーを作成するようになります。これにより、スクロールにも同じパフォーマンスの影響があり、古いレンダラーがメモリに保持されるという追加のボーナスが得られます。

この特定の問題については、ここで説明します

于 2012-09-01T17:55:21.393 に答える