重用和汇集图形

如果要在单个帧上创建数十万个这样的对象,则在运行时创建和配置 SpriteTextField 对象可能会很昂贵。因此,一个常见的技巧是汇集这些对象以供以后重用。请记住,我们不仅要尝试优化创建时间(new Sprite()),还要尝试优化配置(设置默认属性)。

让我们说我们正在使用数百个 TextField 对象构建一个列表组件。需要创建新对象时,请检查是否可以重用现有对象。

var pool:Array = [];

if (pool.length > 0){

    // reuse an existing TextField
    var label = pool.pop();

}else{
    // create a new TextField
    label = new TextField();
    
    // initialize your TextField over here
    label.setDefaultTextFormat(...);
    label.multiline = false;
    label.selectable = false;
}

// add the TextField into the holder so it appears on-screen
// you will need to layout it and set its "text" and other stuff seperately
holder.addChild(label);

稍后,当你销毁组件(或从屏幕中删除它)时,请记住将未使用的标签添加回池中。

foreach (var label in allLabels){
    label.parent.removeChild(label); // remove from parent Sprite
    pool.push(label); // add to pool
}

在大多数情况下,最好为每次使用而不是全局池创建池。创建全局池的缺点是你需要每次重新初始化对象以从池中检索它,以取消其他功能所做的设置。这同样代价高昂,并且几乎否定了首先使用池的性能提升。