在可滚动 window 中显示大量聊天日志或控制台日志的最佳做法是什么? (AS3)
What is the best practice for displaying huge chat logs or console logs in a scrollable window? (AS3)
我正在编写一个图形控制台,当您输入它们时(在 AS3 中)突出显示不同的条目并存储内容,但我发现一旦有数千个条目,程序就会开始滞后并且滚动很慢。如果我想让滚动动画加速,它会变得更慢。
如何上下移动作为我存储条目的巨大对象块?
我是否必须在用户正在查看的位置周围逐步加载消息?那么滚动条是怎么处理的呢?
你应该创建一个自定义容器而不是 TextField
,构建加速滚动也会更容易,
- 每个日志条目都是一个扩展的 DisplayObject,它包含任何你想要的东西,就像 android 中的膨胀布局一样。
最重要的部分应该是减少内存使用:
- 您只能将日志条目的纯文本存储在全局数组之类的东西中,当滚动位置足够接近时,生成此布局,然后将它们添加到容器中以显示,反之亦然以删除远远落后的聊天。
然而,这个过程在运行时仍然使用大量内存。
- 所以,根据android的
DiskLruCache
的概念,有可能存储我们不可见数据的一部分,这太远离我们的滚动位置到磁盘而不是内存,使用 SharedObject's
.
How do I move the giant block of objects that are my stored entries up
and down?
你不知道。正如您所注意到的,当 DisplayList
上的数字 Display Objects
大大增加时,内存开销会增加,管理 Display Objects
的内务处理细节最终会导致性能下降。你没有提到你是如何实现你目前所拥有的东西的任何细节,所以我的评论将是笼统的。
在 Flex 中,列表组件 处理此问题的方式,iOS 我假设 Flash 仅显示所需的最少数量的对象,当用户滚动时,对象会在渲染列表中进出。进一步的优化是使用 "pool" 个 "template" 个对象,这些对象可以重复使用,这样您就不会付出初始化时间的代价。这种(“...缓冲...”)技术可能有一个实际名称,但我不知道它是什么(希望有好心人会提供它和 link 来更全面地描述如何它有效)。
至于它是如何工作的——你可以自己动手做,弄清楚,当用户滚动时,哪些对象正在移出屏幕并且可以回收,哪些将在屏幕上移动,等等。当然这一切都假设您将对象存储在 Array
、ArrayList
或 ArrayCollection
等数据结构中。作为从头开始编写所有这些代码的替代方法,您可能会看看 DataGrid or List 组件是否能满足您的需求——它们会为您管理所有这些。
Flash Tutorial: The DataGrid Component(YouTube 视频)
Customize the List component
还有很多其他示例和资源。
(同样,我在 Flex 中工作,其中 DataGrid 和其他基于列表的组件可以使用 "skins" 和视觉样式的自定义项渲染器进行广泛自定义——不确定是否相同在 Flash 中)
我正在编写一个图形控制台,当您输入它们时(在 AS3 中)突出显示不同的条目并存储内容,但我发现一旦有数千个条目,程序就会开始滞后并且滚动很慢。如果我想让滚动动画加速,它会变得更慢。
如何上下移动作为我存储条目的巨大对象块? 我是否必须在用户正在查看的位置周围逐步加载消息?那么滚动条是怎么处理的呢?
你应该创建一个自定义容器而不是 TextField
,构建加速滚动也会更容易,
- 每个日志条目都是一个扩展的 DisplayObject,它包含任何你想要的东西,就像 android 中的膨胀布局一样。
最重要的部分应该是减少内存使用:
- 您只能将日志条目的纯文本存储在全局数组之类的东西中,当滚动位置足够接近时,生成此布局,然后将它们添加到容器中以显示,反之亦然以删除远远落后的聊天。 然而,这个过程在运行时仍然使用大量内存。
- 所以,根据android的
DiskLruCache
的概念,有可能存储我们不可见数据的一部分,这太远离我们的滚动位置到磁盘而不是内存,使用SharedObject's
.
How do I move the giant block of objects that are my stored entries up and down?
你不知道。正如您所注意到的,当 DisplayList
上的数字 Display Objects
大大增加时,内存开销会增加,管理 Display Objects
的内务处理细节最终会导致性能下降。你没有提到你是如何实现你目前所拥有的东西的任何细节,所以我的评论将是笼统的。
在 Flex 中,列表组件 处理此问题的方式,iOS 我假设 Flash 仅显示所需的最少数量的对象,当用户滚动时,对象会在渲染列表中进出。进一步的优化是使用 "pool" 个 "template" 个对象,这些对象可以重复使用,这样您就不会付出初始化时间的代价。这种(“...缓冲...”)技术可能有一个实际名称,但我不知道它是什么(希望有好心人会提供它和 link 来更全面地描述如何它有效)。
至于它是如何工作的——你可以自己动手做,弄清楚,当用户滚动时,哪些对象正在移出屏幕并且可以回收,哪些将在屏幕上移动,等等。当然这一切都假设您将对象存储在 Array
、ArrayList
或 ArrayCollection
等数据结构中。作为从头开始编写所有这些代码的替代方法,您可能会看看 DataGrid or List 组件是否能满足您的需求——它们会为您管理所有这些。
Flash Tutorial: The DataGrid Component(YouTube 视频)
Customize the List component
还有很多其他示例和资源。
(同样,我在 Flex 中工作,其中 DataGrid 和其他基于列表的组件可以使用 "skins" 和视觉样式的自定义项渲染器进行广泛自定义——不确定是否相同在 Flash 中)