使用大量标签

时间:2015-07-30 18:40:53

标签: multithreading actionscript-3 large-data

(可能是一个愚蠢的问题,但......)我正在尝试编写一个自定义组件,它基本上包含一个相当大的表(最大的,它应该是800 x 35字段,其中最多只有20 x 10一次可见)。我想知道是否有人可以给我一些指示/建议如何以最佳方式做到这一点。

我现在使用的是什么:组件扩展UIComponent,我有一个自定义滚动条,并使用新的spark.components.Label作为表格中每个字段的文本容器。我将标签放在另一个UIComponent内,这样我就可以屏蔽显示区域外的标签边缘。我试过了:

  1. 仅绘制显示区域中包含的数据。当用户移动滚动条时,数据会被重新绘制,但是,由于仍然有很多Labels,因此该组件会变得有点滞后。
  2. 绘制整个表格并使用蒙版/容器位置仅显示由滑块位置表示的表格部分。但是,绘制需要很长时间,并且可能会使用大量内存。
  3. (当前构思)多线程。这对我来说是全新的,所以我设置了一个背景Worker并希望它返回一个UIComponent并绘制表格,同时用户可以继续与组件的其他部分进行交互。 所以我的问题来了:
    • 到目前为止,我无法使用UIComponent转移MessageChannel。是否可以首先使用MessageChannel进行此类转移,还是应该使用其他方法?
    • 类似案例是否有替代方法?也许我应该为文本/表本身使用不同的容器?
    • 也许我应该使用后台工作者绘制BMP并使用它而不是UIComponent。如果是这样,也许有人可以推荐我一个很好的教程或指导如何做到这一点?
  4. 感谢您的帮助,如果您需要任何其他信息,请与我们联系。

    -Vil

2 个答案:

答案 0 :(得分:0)

主要问题(我认为)是每帧重新渲染Text。如果你有一个10,000行的TextField并且屏蔽了除前几行以外的所有行,那么Flash在渲染之前仍会渲染所有10,000行。

正如其他人所提到的,解决方案是自己处理渲染; blitting你想在屏幕上看到的部分。只要其他组件保持visible.false,或者通常只是在DisplayList之外,它们就不会被环境光栅化。

Greensock's BlitMask正是如此。

答案 1 :(得分:0)

好吧,我花了一段时间重新编写代码,但最终做了@BotMaster建议(或至少我的工作是朝这个方向)。所以现在:

  • 对于数据行,我创建了一个包含标签的单独对象,它还在内部处理水平滚动。这样,当我调整垂直滚动条时,我移动整个容器而不是单独移动每个元素。
  • 在程序的开头,我初始化了足够数量的元素(行元素和行/列标签),并将它们存储在单独的ArrayCollection - s中。滚动条更新时:
    • 计算新的可见区域。
    • 检查当前显示列表中的元素是否在新区域中。如果不是 - 我将它们从显示列表移动到各自的ArrayCollection - s,包含未使用的元素。
    • 调整显示列表中剩余元素的位置。
    • 如果新的可见区域中有空格,我会从相应的ArrayCollection - s中获取元素,调整其文本并将其放置在显示列表中。

现在滚动比以前更顺畅。