создание небольшого графического движка: visible vs. addChild/removeChild

В настоящее время я экспериментирую с очень простым графическим интерфейсом... "двигатель" (я думаю, вы могли бы назвать его так). Суть этого:

  1. есть FrontController, который получает запросы пользователей; каждый запрос имеет uid
  2. каждый uid(читай «страница») имеет объявление компонентов («модулей»), которые на нем присутствуют
  3. компоненты — это Sprite подклассы и, по сути, уникальны

Естественно, мне нужен способ скрыть/показать эти спрайты. В настоящее время у меня это почти так же, как у Flex по умолчанию - в том смысле, что «если мы находимся в месте, где видна композиция, создайте ее, кэшируйте и повторно используйте каждый раз, когда она снова видна».

Вопрос в том, что будет более подходящим и эффективным способом скрытия и отображения — через addChild/ removeChildили переключение visible.

Я вижу это так:

  • visibleбыстро и грязно (на первых тестах)
  • visibleне создает цепочку всплывающих событий, таких как Event.ADDEDили Событие.УДАЛЕНО
  • невидимые компоненты не получают события мыши

Таким образом, removeChildбудет чем-то, что я вызову, когда буду уверен, что компонент больше не будет нужен на экране (или кэш слишком велик, например)

Что думают люди, помешанные на stackoverflow/AS3?

Обновление: Вот хорошее чтение(забыл про гугл).

я буду придерживаться visible; кажется, он лучше подходит для моей задачи; руководство Adobe «ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ ДЛЯ ПЛАТФОРМЫ FLASH» на стр. 69 придало мне еще больше уверенности.

Вот фрагмент кода, который я выложил для проверки тем, кому это интересно:

package 
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.utils.getTimer;

/**
 * Simple benchmark to test alternatives for hiding and showing
 * DisplayObject.
 * 
 * Use:
 * 
 * new DisplayBM(stage);
 * 
 * 
 * Hit:
 * - "1" to addChild (note that hitting it 2 times is expensive; i think
 * this is because the player has to check whether or not the comp is
 * used elsewhere)
 * - "q" to removeChild (2 times in a row will throw an exception) 
 * - "2" to set visible to true
 * - "w" to set visible to false
 * 
 * @author Vasi Grigorash
 */    
public class DisplayBM{
    public function DisplayBM(stage:Stage){
        super();

        var insts:uint = 5000;
        var v:Vector. = new Vector.(insts);
        var i:Number = v.length, s:Sprite
        while (i--){
            s = new Sprite;
            s.graphics.beginFill(Math.random() * 0xFFFFFF);
            s.graphics.drawRect(
                Math.random() * stage.stageWidth, 
                Math.random() * stage.stageHeight,
                10, 
                10
            );
            s.graphics.endFill();
            v[i] = s;
        }

        var store:Object = {};
        store[Event.ADDED] = null;
        store[Event.REMOVED] = null;
        var count:Function = function(e:Event):void{
            store[e.type]++;
        }
        var keydown:Function = function (e:KeyboardEvent):void{
            var key:String
            //clear event counts from last run
            for (key in store){
                store[key] = 0;
            }

            stage.addEventListener(Event.ADDED, count);
            stage.addEventListener(Event.REMOVED, count);

            var s0:uint = getTimer(), op:String;
            var i:Number = v.length;
            if (e.keyCode === Keyboard.NUMBER_1){
                op = 'addChild';
                while (i--){
                    stage.addChild(v[i]);
                }
            }
            if (e.keyCode === Keyboard.Q){
                op = 'removeChild';
                while (i--){
                    stage.removeChild(v[i]);
                }
            }
            if (e.keyCode === Keyboard.NUMBER_2){
                op = 'visibile';
                while (i--){
                    v[i].visible = true;
                }
            }
            if (e.keyCode === Keyboard.W){
                op = 'invisibile';
                while (i--){
                    v[i].visible = false;
                }
            }
            if (op){
                //format events
                var events:Array = [];
                for (key in store){
                    events.push(key + ' : ' + store[key])
                }

                trace(op + ' took ' + (getTimer() - s0) + ' ' + events.join(','));
            }

            stage.removeEventListener(Event.ADDED, count);
            stage.removeEventListener(Event.REMOVED, count);
        }

        //autodispatch
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
    }
}
}

5
задан Grigorash Vasilij 6 April 2012 в 17:05
поделиться