[客户端][UI] UMG缓存池控件

作者:邱子鉴
创建时间:2016.11.10
最后更新:2016.11.10


通用组件

1.名称:Common_PoolManager
2.路径:


需求说明

我们通常需要在Panel下面放置相同类型的组件,如在list下放置item。而数据的初始化和更新是我们必须要处理的问题,一般步骤是,创建item,然后填充item内容,但是,通过profile分析工具发现,CreateWidget的过程非常昂贵,所以,我们可以创建一个缓存池,将创建过的widget缓存起来,每当我们需要widget的时候,从缓存池内读取一个即可,当不够时,再创建新的widget。


使用方法

1.在UMG中,放入Common_PoolManager。

2.设置TemplateClass类型。表示缓存池内,item的widget类型。

3.将一个PanelWidget类型的控件,如ScrollBox,放入Common_PoolManager的子节点处。结构如下图

-Common_PoolManager
  -NamedSlot
    -PanelWidget
      -item
      ...

4.代码中,调用GetAvailableWidget获取可用item。


实现细节

1.使用两个变量存放已创建的widget,

WidgetPoolList,记录所有已创建的widget
UsingWidgetList,记录正在使用的widget

2.初始化。设计Common_PoolManager组件时,希望能够自动将已有的widget存入list中,这样用起来会省去手动初始化的工作,比较方便。因此,在Common_PoolManager内部,首先添加NamedSlot, 作为Root节点,这样,在外部使用时,就可以在Common_PoolManager下面添加子节点,层级关系如下:

-Common_PoolManager
  -NamedSlot
    -PanelWidget
      -item
      -item
      ...

其中,NamedSlot下必须放置一种PanelWidget,如VerticalBox/ScrollBox/GridPanel等。这样,在Common_PoolManager的Construct时,可以遍历PanelWidget的所有子节点,并保存到WidgetPoolList内。

Note: 由于item在不同场景下,需求类型也是不同的,所以,使用者需要告知Common_PoolManager它的类型。即,TemplateClass。

3.通过visiblity控制widget的显示or隐藏。

初始化时,将已经创建的widget存入WidgetPoolList中,并且将visibility置成collapse。

4.对外开放接口GetAvailableWidget。外部只需访问GetAvailableWidget即可获得可用的widget

foreach item in  WidgetPoolList
  if itemnot in UsingWidgetList
    UsingWidgetList <- item 
    item.visibility <- SelfHitTestVisibility
    return item
//create a new one based on TemplateClass
item <- new TemplateClass
UsingWidgetList <- item 
WidgetPoolList <- item
item.visibility <- SelfHitTestVisibility
return item

你可能感兴趣的:([客户端][UI] UMG缓存池控件)