GWT活动 - 使用SimplePanel与DeckPanel(卡面板)的性能影响

时间:2011-09-13 20:15:13

标签: gwt mvp gwt-mvp

在我见过的大多数活动和地方示例中,人们使用SimplePanel作为ActivityManager的显示。

我想知道使用DeckPanel / DeckLayoutPanel而不是SimplePanel是否有好处。在实现AcceptsOnWidget的Deck面板周围创建一个包装器是相当简单的。

我还没有在任何地方看过这个话题。在GWT中常用的MVP +活动之前,人们通常使用Tab面板(内部使用甲板类型面板)和Deck面板来控制给定视图中面板之间的切换。

两者之间的区别是SimplePanel.setWidget(..)将从DOM中删除前一个子项并附加新的小部件,而甲板类型面板将使用CSS来控制当前面板的可见性(即“display:none “隐藏不活动的面板。”

  1. 如果使用卡座面板,通常意味着您将在DOM中拥有更多元素。我想这会占用更多内存并使应用程序“缓慢”,即使这些节点不可见(“display:none”)。这是真的吗?

  2. 如果这是真的,为什么Google使用了TabPanel / TabLayoutPanel的卡座面板样式impl而不是内部使用SimplePanel?

  3. 一种方法比另一方更有利吗?

2 个答案:

答案 0 :(得分:3)

表现明智没有区别。这一切都取决于你如何使用它。在DeckLayoutPanel中,所有孩子都被留在记忆中。但是如果你要用SimplePanel实现同样的东西,你需要自己保持一个指向那些相同孩子的指针,所以内存占用量大致相同。除非使用SimplePanel,否则每次显示时都会创建并渲染一个子项,并在隐藏时将其丢弃,这可能是内存有效的(如果垃圾收集器能够正常工作),但由于渲染很昂贵,因此它会影响可用性。

第二,如果您使用DeckLayoutPanel,它的所有子项都会立即创建,而只显示一个。对于性能,这可能不是最佳的。因此,您可以在子项和DeckLayoutPanel之间添加一个LazyPanel,因此它只在显示时创建。但是这可能需要一些额外的编码才能使它工作(因为它很懒,你需要懒惰初始化它,这可能会导致一些困难)但是,仍然是DeckLayoutPanel和SimplePanel之间的比较,这只是你何时创建子项的问题SimplePanel(所有前置==与DeckLayoutPanel相同的问题),而不是特定于DeckLayoutPanel和SimplePanel之间差异的东西。

一般情况下,如果你有一个已定义的有序子集,请使用DeckLayoutPanel(如使用TabPanel),如果你有一个未定义的集合,SimplePanel是更好的选择(比如在MVP中显示当前视图)。

答案 1 :(得分:0)

DeckLayoutPanel在内部保存所有视图的集合(实际上是您已注册或显示的视图),以便能够确定滑动动画方向(取决于您是返回还是前进)。除此之外,我没有注意到从SimplePanel do DeckLayoutPanel切换时应用程序变得迟缓。当你的所有观点都是单身人士时,这是特别安全的。但请注意,在这种情况下,当在同一视图实例之间切换时(例如主要类别列表 - >子类别列表),DeckLayoutPanel可能在渲染滑动动画时遇到一些问题。

在我看来没有有利的解决方案 - 如果你不需要“滑动”面板,我不会使用DeckLayoutPanel(因为所有额外的组件都会增加复杂性)。