Obecnie eksperymentuję z bardzo prostym rysunkiem graficznym ... "silnika" (chyba można to tak nazwać). Istota tego:budowa małego graficznego silnika: widoczny vs. addChild/removeChild
- Istnieje FrontController, który zostaje trafiony przez żądania użytkownika; Każdy wniosek ma uid
- każdy uid (czytaj „strona”) posiada deklarację komponentów („modułów”), które są obecne na nim
- komponenty są Sprite podklasy i, w istocie, są unikalne
Naturalnie potrzebuję sposobu na ukrycie/pokazanie tych duszków. Obecnie mam go tak, jak Flex ma domyślnie - w sposób "jeśli jesteśmy w miejscu, w którym jest widoczny komputer, stwórz go, przechowuj w pamięci podręcznej i używaj ponownie za każdym razem, gdy jest znowu widoczny".
Pytanie brzmi - który byłby bardziej odpowiedni i skuteczny sposób ukrywania się i pokazywania - za pomocą addChild
/removeChild
lub przełączania visible
.
Według mnie jest to, że:
visible
jest szybki i brudny (na pierwszych testach)visible
nie tworzy łańcuch zdarzeń propagacji jakEvent.ADDED
lubEvent.REMOVED
- niewidocznych elementów don Zdarzenia myszy:
Więc removeChild
byłby czymś, co zadzwoniłbym, gdybym Na pewno, że komponent nie będzie już potrzebny na ekranie (lub na przykład pamięć podręczna jest zbyt duża)
Co sądzą stackoverflow'ers/AS3-szaleńcy?
Aktualizacja: Oto good read (zapomniałem o Google).
Będę trzymać się visible
; wydaje się, że lepiej pasuje do mojego zadania; instrukcja "OPTYMALIZACJA WYDAJNOŚCI DLA PLATFORMY FLASH" autorstwa Adobe na str. 69 dało mi jeszcze więcej pewności siebie.
oto fragment kodu i umieścić do testowania rzeczy dla tych, którzy są zainteresowani:
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:
* <code>
* new DisplayBM(stage);
* </code>
*
* 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.<Sprite> = new Vector.<Sprite>(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);
}
}
}
Jeśli to, co trzeba, aby ukryć/pokazać zużywa dużo zasobów, zwykle będę removeChild/addChild nad ustawieniami jej widoczność. Jeśli jej coś mniejszego lub mniej skomplikowanego, jak grafika lub pole tekstowe, ustawię jego widoczność lub alfa. Wszystko zależy od tego, co musisz ukryć/pokazać – Ronnie
@Ronnie removeChild usuwa tylko przedmiot z listy wyświetlania - nic więcej. –
Przepraszam, ustawiłem go również na wartość zerową i odtwarzam, kiedy tego potrzebuję. – Ronnie