Hiện tại, tôi đang thử nghiệm với một bản vẽ GUI rất đơn giản ... "động cơ" (tôi đoán bạn có thể gọi nó là). Ý chính của nó:xây dựng công cụ GUI nhỏ: hiển thị so với addChild/removeChild
- có một FrontController bị truy cập bởi các yêu cầu của người dùng; mỗi yêu cầu có một uid
- mỗi uid (đọc "trang") đã ra tuyên bố của các thành phần ("module") có mặt trên đó
- thành phần là Sprite lớp con, và trong bản chất, là duy nhất
Đương nhiên, tôi cần cách ẩn/hiển thị các sprites này. Hiện nay, tôi có nó khá giống như Flex có nó theo mặc định - trong cách "nếu chúng ta đang ở một nơi mà comp có thể nhìn thấy, tạo nó, cache nó và tái sử dụng nó mỗi khi nó có thể nhìn thấy một lần nữa".
Câu hỏi đặt ra là - cách thức phù hợp và hiệu quả hơn để ẩn và hiển thị - qua số addChild
/removeChild
hoặc toggling visible
.
Cách tôi nhìn thấy nó là:
visible
là nhanh chóng và dơ bẩn (các bài kiểm tra đầu tiên)visible
không tạo ra một chuỗi các sự kiện bọt nhưEvent.ADDED
hoặcEvent.REMOVED
- thành phần vô hình don không nhận được sự kiện chuột
Vì vậy, removeChild
sẽ là điều tôi muốn gọi khi tôi ' chắc chắn, thành phần đó sẽ không còn cần thiết trên màn hình (hoặc bộ nhớ cache quá lớn), ví dụ:
Những người xếp chồng/người có suy nghĩ AS3 nghĩ gì?
Cập nhật: Đây là good read (quên về google).
tôi sẽ gắn bó với visible
; nó có vẻ phù hợp với nhiệm vụ của tôi tốt hơn; hướng dẫn sử dụng "TÍNH CHẤT TỐI ƯU HÓA CHO TUYỆT VỜI FLASH" của Adobe trên trang. 69 đã giúp tôi tự tin hơn.
đây là một đoạn mã tôi đặt lên để kiểm tra mọi thứ cho những người quan tâm:
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);
}
}
}
Nếu những gì tôi cần để ẩn/hiển thị sử dụng rất nhiều nguồn lực, thường tôi sẽ removeChild/addChild qua Cài đặt hiển thị của nó. Nếu thứ gì đó nhỏ hoặc ít phức tạp như một trường đồ họa hoặc văn bản, tôi sẽ đặt mức độ hiển thị hoặc alpha của nó. Tất cả phụ thuộc vào những gì nó là bạn cần phải ẩn/hiển thị – Ronnie
@Ronnie removeChild chỉ loại bỏ các mục từ danh sách hiển thị - không có gì nhiều hơn nữa. –
xin lỗi, tôi thiết lập nó để null quá và tái tạo khi tôi cần nó – Ronnie