2011-06-04 43 views
3

我有一个关于星火DataGrid的问题,以及如何在垃圾收集 方面的工作。什么我发现是,如果我动态从DataGrid在运行时添加和删除列 的GridColumns和itemRenderer的永远不会释放从内存 。星火Datagrid的内存使用情况

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

如果我添加5列回来,它不会出现实例更GridColumns或 的itemRenderer - 仍有100个总渲染器以及内存10列。

这并不与MX DataGrid的发生。由于列被删除的 渲染器和和DataGridColumns也会从内存中释放,当我在 探查一下之后,我看到了0项渲染器和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> 
+0

“如果我有一个包含10个项目的10个项目的列表,并且我创建了10个列,那么将有100个ItemRenderer”;这只有在您的DataGrid显示10行时才为true。你是DataGrid显示5行;然后你有50个itemRenderer。[注意:我不确定Spark DataGrid是否创建了所有的像MX DataGrid一样的列;如果没有,你可能会有更少的渲染器;根据显示的列数) – JeffryHouser 2011-06-04 17:09:00

+0

+1,用于提供完整的可运行样本。 – JeffryHouser 2011-06-04 17:10:25

回答

1

我还没有机会看一下在Flex的DataGrid的4.5代码,但我将他们使用object pooling想象用于项目渲染器。

数据网格是所有关于速度,什么花费最多的时间通常是项目渲染器(尤其是实例)。为了快速保持DataGrid,他们不会立即“销毁”项目渲染器。它会持续x时间;或者对于某些对象池算法,从不释放它们。将它们保存在内存中会更容易,因为它们并不是首要的巨大,并且具有更快的动态DataGrid。

其实,我做了一个快速谷歌搜索和I was right

所有这些数据网格IFactory的皮肤 部分必须是 IVisualElements的。在许多情况下,他们只是 像GraphicElements或Rects线 ,它可以相当有效地 因为呈示了Flex运行时的 “显示对象共享”支持使用 单一的DisplayObject,使它们的所有 。就像项目渲染器, 这些视觉元素内部 汇集和回收,以避免成本 创建和添加他们当 DataGrid中滚动。

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

0

我beleive的回答你的问题是“useVirtualLayout”属性。

您可以将容器配置为使用虚拟布局,而不是为每个子项创建项呈示器。使用虚拟布局,容器重用项目渲染器,以便>它仅为容器的当前可见子项创建项目渲染器。当一个孩子从屏幕上移开时,可能通过滚动容器,一个正在滚动到屏幕上的新孩子可以重用其项目渲染器。

要将容器配置为使用虚拟布局,请将与容器关联的布局的useVirtualLayout属性设置为true。只有布局设置为VerticalLayout,Horizo​​ntalLayout或TileLayout的DataGroup或SkinnableDataContainer支持虚拟布局。不支持虚拟化的布局子类必须防止改变这种prope。”

来源:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/layouts/supportClasses/LayoutBase.html#useVirtualLayout

编辑:刚刚发现DataGrid中只支持VirtualLayouts,因为它使用了自定义的‘网格布局’所以,也许这不是你的问题的答案