使用大量标签
Working with large number of Labels
(可能是一个菜鸟问题,但是...)我正在尝试编写一个自定义组件,它基本上包含一个相当大的 table(最大,它应该是 800 x 35 个字段,其中只有一次最多可以看到 20 x 10 个)。我想知道是否有人可以告诉我一些 pointers/advices 如何以最佳方式做到这一点。
我现在使用什么: 组件扩展 UIComponent
,我有一个自定义滚动条并使用新的 spark.components.Label
作为文本容器table 中的每个字段。我将标签放在另一个 UIComponent
内,这样我就可以遮盖显示区域外的标签边缘。我试过:
- 只绘制显示区域中包含的数据。当用户移动滚动条时,数据会重新绘制,但是,由于仍然有很多
Labels
,组件变得有点滞后。
- 绘制整个 table 并使用 mask/container 位置仅显示滑块位置所代表的 table 部分。但是,绘制需要很长时间,我想可能会占用大量内存。
- (当前想法) 多线程。这对我来说是全新的,所以我设置了一个背景
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 中取出元素,调整它们的文本和位置,然后将它们放回显示列表中。
现在的滚动比以前顺畅多了。
(可能是一个菜鸟问题,但是...)我正在尝试编写一个自定义组件,它基本上包含一个相当大的 table(最大,它应该是 800 x 35 个字段,其中只有一次最多可以看到 20 x 10 个)。我想知道是否有人可以告诉我一些 pointers/advices 如何以最佳方式做到这一点。
我现在使用什么: 组件扩展 UIComponent
,我有一个自定义滚动条并使用新的 spark.components.Label
作为文本容器table 中的每个字段。我将标签放在另一个 UIComponent
内,这样我就可以遮盖显示区域外的标签边缘。我试过:
- 只绘制显示区域中包含的数据。当用户移动滚动条时,数据会重新绘制,但是,由于仍然有很多
Labels
,组件变得有点滞后。 - 绘制整个 table 并使用 mask/container 位置仅显示滑块位置所代表的 table 部分。但是,绘制需要很长时间,我想可能会占用大量内存。
- (当前想法) 多线程。这对我来说是全新的,所以我设置了一个背景
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 中取出元素,调整它们的文本和位置,然后将它们放回显示列表中。
现在的滚动比以前顺畅多了。