apache-flex - 动态列的 Spark Datagrid 内存使用情况

标签 apache-flex memory datagrid itemrenderer flex-spark

我对 Spark DataGrid 及其在垃圾方面的工作方式有疑问
收藏。我发现如果我动态添加和删除列
在运行时从 DataGrid 中,GridColumns 和 ItemRenderers 永远不会被释放
从内存里。

例如,如果我有一个包含 10 个项目的列表并创建了 10 列,那么
是 100 个 ItemRenderer 和 10 个 GridColumns。如果我删除所有列,它们
还在那里。

如果我添加 5 列,它似乎不会实例化更多 GridColumns 或
ItemRenderers - 内存中仍有 100 个渲染器和 10 列。

MX DataGrid 不会发生这种情况。随着列被删除
ItemRenderers 和 DataGridColumns 从内存中释放出来,当我查看
分析器之后,我看到 0 个 ItemRenderers 和 1 个 DataGridColumn。

有人知道这里会发生什么吗?或者我只是
遗漏了什么?

这是我用来测试 Spark DataGrid 的代码:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Declarations>
        <s:ArrayList id="dp">
            <fx:Object label="label 1"/>
            <fx:Object label="label 2"/>
            <fx:Object label="label 3"/>
            <fx:Object label="label 4"/>
            <fx:Object label="label 5"/>
            <fx:Object label="label 6"/>
            <fx:Object label="label 7"/>
            <fx:Object label="label 8"/>
            <fx:Object label="label 9"/>
            <fx:Object label="label 10"/>
        </s:ArrayList>
        <s:ArrayList id="columns">
            <s:GridColumn dataField="label"/>
        </s:ArrayList>
    </fx:Declarations>
    <s:layout>
        <s:VerticalLayout/>
    </s:layout>
    <s:DataGrid dataProvider="{dp}" columns="{columns}" width="100%" height="100%"/>

    <s:HGroup>
        <s:Button label="Add Column" click="columns.addItem(new GridColumn('label'))"/>
        <s:Button label="Remove Column" click="if( columns.length > 0 ) columns.removeItemAt(0)"/>
    </s:HGroup>
</s:Application>

最佳答案

我还没有机会查看 Flex 4.5 DataGrid 代码,但我想他们正在使用 object pooling对于项目渲染器。

DataGrid 是关于速度的,花费最多时间的通常是项目渲染器(尤其是实例化)。为了使 DataGrid 保持快速,它们不会立即“销毁”项目呈现器。它将保留它们 x 时间;或者对于某些对象池算法,永远不要释放它们。将它们保存在内存中更容易,因为它们一开始就不应该很大,并且具有更快的动态 DataGrid。

实际上,我做了一个快速的谷歌搜索和I was right :

All of these DataGrid IFactory skin parts are required to be IVisualElements. In many cases they're just GraphicElements like Rects or Lines, which can be renderered quite efficiently because the Flex runtime's "display object sharing" support uses a single DisplayObject to render all of them. Just like item renderers, these visual elements are internally pooled and recycled, to avoid the cost creating and adding them when the DataGrid is scrolled.



似乎项目渲染器不仅汇集在每个 DataGrid 中,而且汇集在所有 DataGrid 中。我不得不说非常好的做法。相信我,这对 DataGrids 上的 Flex 性能非常有益。

关于apache-flex - 动态列的 Spark Datagrid 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237422/

相关文章:

apache-flex - 在 Emacs 中使用 gdb 模式调试 flash

apache-flex - 在 Flex (compc) 生成的 SWC 上实时预览

actionscript-3 - AS3/Flex 性能 - 新的 ArrayList 与 ArrayList.removeAll()

c++ - 我可以在析构函数中调用公共(public)函数来释放内存吗?

c# - 通过数据库使用 ViewModel 填充 DataGrid

javascript - 使用 complexQuery 的 Dojo DataGrid 过滤不起作用

css - 为大量图像设置 Flex/AIR 元素结构?

linux - 页面置换算法

JavaScript setTimeout 内存问题

c# - WPF 数据网格滚动问题