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

如果您使用的itemRendererFunction是 Flex 4.0 到 4.5 SDK,则您的项目渲染器List不会被回收。这会对列表的滚动性能产生很大的性能影响。

在 Flex 4.6 中,他们改进了功能,以便在使用项目渲染器功能时可以回收项目渲染器。

通过对上面示例所做的改进,您一针见血。第一个明显的改进是您避免了每次都创建一个新的类工厂。但是还有更重要的事情,它会阻止列表回收渲染器(即使是 Flex 4.6)。

itemRendererFunction每次返回一个新的类工厂时,它会扰乱列表对项目渲染器的内部跟踪,并导致列表创建新的渲染器而不是在可能的情况下重新使用它们。然后,这对滚动具有相同的性能影响,以及将旧渲染器保留在内存中的额外好处。

这个特殊的问题在这里讨论

于 2012-09-01T17:55:21.393 回答