使用大量标签

Working with large number of Labels

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

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

  1. 只绘制显示区域中包含的数据。当用户移动滚动条时,数据会重新绘制,但是,由于仍然有很多Labels,组件变得有点滞后。
  2. 绘制整个 table 并使用 mask/container 位置仅显示滑块位置所代表的 table 部分。但是,绘制需要很长时间,我想可能会占用大量内存。
  3. (当前想法) 多线程。这对我来说是全新的,所以我设置了一个背景 Worker 并希望它成为 return 一个 UIComponent 并绘制了 table,同时用户可以继续与组件的其他部分。 所以我的问题来了:
    • 到目前为止,我在使用 MessageChannel 传输 UIComponent 时遇到问题。是否可以首先使用 MessageChannel 进行这种转移,还是我应该使用替代方法?
    • 是否有针对类似情况的替代方法?也许我应该为 text/table 本身使用不同的容器?
    • 也许我应该使用后台工作者来绘制 BMP 并使用它而不是 UIComponent。如果是这样,也许有人可以向我推荐一个很好的教程或指导如何做到这一点?

感谢您的帮助,如果您需要任何其他信息,请告诉我。

-维尔

主要问题(如我所见)是文本在每一帧都被重新渲染。如果您有一个 10,000 行的 TextField 并且除了前几行之外的所有行都被屏蔽掉,Flash 仍然会在屏蔽之前呈现所有 10,000 行。

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

Greensock's BlitMask 正是这样做的。

好吧,我花了一些时间来重写代码,但最终还是按照@BotMaster 的建议做了(或者至少我的工作是朝那个方向进行的)。所以现在:

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

现在的滚动比以前顺畅多了。