Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 具有大量UI对象的Flex应用程序==速度慢?_Apache Flex_Flash_Actionscript 3_Flex3 - Fatal编程技术网

Apache flex 具有大量UI对象的Flex应用程序==速度慢?

Apache flex 具有大量UI对象的Flex应用程序==速度慢?,apache-flex,flash,actionscript-3,flex3,Apache Flex,Flash,Actionscript 3,Flex3,我正在Flex3中构建我的第一个Flex定制组件。它是一个基于“网格”容器类的数据表,每个单元格中都有一个简单的文本标签。(DataGrid和AdvancedDataGrid不是适合我需求的起点。)该组件在使用较小的表时运行良好,但我尝试使用较大的表对其进行压力测试,结果令人失望 组件创建过程有一些缓慢的地方,但这些都是我能够优化的,并不是我最关心的。我更担心的是Flex框架本身的局限性 这个“大”样本表中有7000多个单元格。这是一个更大的数字,但仍然比我需要容纳的最大数字少1-2个数量级。在

我正在Flex3中构建我的第一个Flex定制组件。它是一个基于“网格”容器类的数据表,每个单元格中都有一个简单的文本标签。(DataGrid和AdvancedDataGrid不是适合我需求的起点。)该组件在使用较小的表时运行良好,但我尝试使用较大的表对其进行压力测试,结果令人失望

组件创建过程有一些缓慢的地方,但这些都是我能够优化的,并不是我最关心的。我更担心的是Flex框架本身的局限性

这个“大”样本表中有7000多个单元格。这是一个更大的数字,但仍然比我需要容纳的最大数字少1-2个数量级。在标准网格结构中,组件的主要部分由一个网格组成,该网格有400个网格行,每个网格行包含16个网格项,再加上一些其他较小的辅助网格

一旦表格呈现,我会发现以下内容:

  • 与鼠标相关的事件启动缓慢。具体地说,我在每个表单元格上注册了滚动/滚动事件处理程序,以便突出显示指针下的单元格。在一张小桌子上,我可以很快地将鼠标移到桌子上,高亮显示将实时跟随指针。对于较大的表格,高亮显示非常不稳定,每秒仅更改两次,跳过许多单元格
  • 如果我将鼠标光标放在组件上,并将其留在那里,我的CPU将被锁定(无论如何,只有一个处理器内核),并一直保持这种状态,直到我离开组件,当它变为空闲时。我的组件在这一点上什么都没有做
感觉Flex根本无法扩展以支持如此大的组件树。我不寒而栗地想象它在100000个细胞中的行为。也许我把网格推到了它的预期用途之外,但是每个表单元格有一个对象似乎不是一个不合理的模型,树中大约14000个对象(每个单元格有一个GridItem和一个标签)似乎非常简单

我还没有从FlexBuilder profiler中获得有用的数据;我正在努力。目前,我最大的问题是:

  • 我真的通过这个适度的测试来突破Flex的极限吗
  • 我对该组件的处理方法是否完全偏离了基准

我在WinXP上Firefox下的Flash Player 9上运行此功能。

是的,Flex的设计不是为了支持大量组件,众所周知,您应该尽量减少组件数量,不要使用不需要的功能(例如,如果不需要额外的功能,则使用DisplayObject而不是Canvas)

使用显示的对象精确镜像数据是不明智的。DisplayObjects(和相关类)相对来说比较重,您需要控制它们的数量

我想说的是,你现在工作的规模,有1000多个单元格,每个单元格都有一个事件监听器,肯定会达到Flex的极限


我认为您应该更好地了解您的方法和体系结构。我假设您没有同时显示所有1000多个项目,也许您应该在每个屏幕上使用分页和显示100ish,使用上一页/下一页按钮移动到另一页。还可以考虑使用自定义滚动条动态添加和移除行,模拟滚动效果。要做到这一点要复杂得多。

没有看到您的代码,也不知道您要做什么……一次将这么多数据推到框架中,显然是在突破Flex的限制

请记住,Flash运行时不是为处理大型应用程序而设计的……而是在浏览器中运行一些轻量级的应用程序。您的用户似乎不太可能需要同时访问所有这些控件


您可以尝试提供数据服务(Java、.NET等)来驱动应用程序中的数据。然后,您可以对数据进行分页,这样框架一次只能处理200-300多个元素。

如果您查看Flex框架中的任何基于列表的控件,您会发现它们大量使用了回收的项目呈现器。因此,显示20行的DataGrid只会创建大约22个渲染器,并在滚动列表时回收它们。这就是为什么DataGrid可以保存数千条记录,并且仍然具有相当快的性能。我建议您查看Peter Ent关于项目呈现器的系列文章,并查看ListBase/List和一些相关类,以了解如何构建类似的内容:


在flex中,如果使用鼠标移动事件重新绘制任何内容。。您可能经历了非常缓慢的渲染

例如:

this.addEventListener(MouseEvent.MOUSE_MOVE,redraw)

上面的代码导致渲染速度非常慢

解决方案:

使用Event.ENTER\u FRAME Event替代?虽然比鼠标移动事件更占用资源,但您每秒应该会收到更多更新,从而使鼠标对用户的反应更灵敏:

例如:

this.addEventListener(Event.ENTER_FRAME,redraw);而不是

this.addEventListener(MouseEvent.MOUSE_MOVE,redraw)

你可以走了,快走

更多关于:
天啊,看来我们可以就这个话题写一本书了。或者至少一章。在开发产品的过程中,我们在这方面学到了不少东西

底线-是的,当你在屏幕上添加1000+个“东西”时,Flex会减速到停止。这里有一些要点,以及对已经提到的内容的一些重复(只是为了简洁)

1) 总是只画可见的东西。新Spark DataGrid的架构师汉斯·穆勒(Hans Muller)在视口方面写得很好。因此,实例化足够多的“单元”来填充可见区域,并在用户滚动时基本上回收它们

2) 回收,回收,回收
public function redraw(anything:Object=null):void{
        //draw something here
            this.graphics.clear();
            this.graphics.lineStyle(3, 0x000000);
            this.graphics.moveTo(startPoint.x, startPoint.y);
            this.graphics.lineTo(endPoint.x, endPoint.y);
            this.scaleTextInput.x = centerPoint.x;
            this.scaleTextInput.y = centerPoint.y;

    }