Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 如何安全地触发stage.invalidate()?_Flash_Actionscript 3 - Fatal编程技术网

Flash 如何安全地触发stage.invalidate()?

Flash 如何安全地触发stage.invalidate()?,flash,actionscript-3,Flash,Actionscript 3,我有一个视觉组件,它应该在更新后重新绘制,而不是在屏幕刷新之前立即绘制。我成功地使用了事件。渲染 我遇到了一个问题,即如果我的组件是从另一个组件的渲染处理程序中更新的,Flash会忽略必要的stage.invalidate()命令 下面是有趣的代码主类: public class StageInvalidateTest extends Sprite { private var _c : Component; public function StageInvalidateTest

我有一个视觉组件,它应该在更新后重新绘制,而不是在屏幕刷新之前立即绘制。我成功地使用了
事件。渲染

我遇到了一个问题,即如果我的组件是从另一个组件的渲染处理程序中更新的,Flash会忽略必要的
stage.invalidate()
命令

下面是有趣的代码主类

public class StageInvalidateTest extends Sprite {
    private var _c : Component;

    public function StageInvalidateTest() {
        stage.frameRate = 1;
        setTimeout(start, 1000);
    }

    private function start() : void {
        trace ("START", getTimer());

        _c = new Component("C");
        addChild(_c);

        var c2 : Component = new Component("C2");
        addChild(c2);
        c2.update();

        addEventListener(Event.RENDER, renderMain);
        stage.invalidate();
    }

    private function renderMain(event : Event) : void {
        trace ("RENDER main", getTimer());
        removeEventListener(Event.RENDER, renderMain);
        _c.update();
    }
}
public class Component extends Sprite {
    private var _name : String;

    public function Component(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component2 extends Sprite {
    private var _name : String;
    private var _timer : Timer;

    public function Component2(name : String) {
        _name = name;
        _timer = new Timer(0);
        _timer.addEventListener(TimerEvent.TIMER, handleTimer);
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        _timer.start();
        stage.invalidate();
    }

    private function handleTimer(event : TimerEvent) : void {
        trace ("--- --- TIMER", _name, _timer.currentCount, getTimer());
        _timer.stop();
        event.updateAfterEvent();
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        _timer.stop();
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component3 extends Sprite {
    private var _name : String;

    public function Component3(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        addEventListener(Event.ENTER_FRAME, enterFrame);
        stage.invalidate();
    }

    private function enterFrame(event : Event) : void {
        trace ("--- --- ENTER_FRAME", _name, getTimer());
        renderComponent(event);
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
        removeEventListener(Event.ENTER_FRAME, enterFrame);
    }
}
组件

public class StageInvalidateTest extends Sprite {
    private var _c : Component;

    public function StageInvalidateTest() {
        stage.frameRate = 1;
        setTimeout(start, 1000);
    }

    private function start() : void {
        trace ("START", getTimer());

        _c = new Component("C");
        addChild(_c);

        var c2 : Component = new Component("C2");
        addChild(c2);
        c2.update();

        addEventListener(Event.RENDER, renderMain);
        stage.invalidate();
    }

    private function renderMain(event : Event) : void {
        trace ("RENDER main", getTimer());
        removeEventListener(Event.RENDER, renderMain);
        _c.update();
    }
}
public class Component extends Sprite {
    private var _name : String;

    public function Component(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component2 extends Sprite {
    private var _name : String;
    private var _timer : Timer;

    public function Component2(name : String) {
        _name = name;
        _timer = new Timer(0);
        _timer.addEventListener(TimerEvent.TIMER, handleTimer);
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        _timer.start();
        stage.invalidate();
    }

    private function handleTimer(event : TimerEvent) : void {
        trace ("--- --- TIMER", _name, _timer.currentCount, getTimer());
        _timer.stop();
        event.updateAfterEvent();
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        _timer.stop();
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component3 extends Sprite {
    private var _name : String;

    public function Component3(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        addEventListener(Event.ENTER_FRAME, enterFrame);
        stage.invalidate();
    }

    private function enterFrame(event : Event) : void {
        trace ("--- --- ENTER_FRAME", _name, getTimer());
        renderComponent(event);
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
        removeEventListener(Event.ENTER_FRAME, enterFrame);
    }
}
以下是有趣的输出:

START 1994
UPDATE component C2 1995
RENDER component C2 1996
RENDER main 1996
UPDATE component C 1997
组件
C
从不渲染

问题是:

让我的组件使用渲染事件的安全方法是什么?


我有两个快速的想法:

1) 使用一个额外的计时器调用
stage.invalidate()
,延迟
0
(零)。计时器在第一次调用其事件处理程序时停止。渲染在更新之后立即进行组件

public class StageInvalidateTest extends Sprite {
    private var _c : Component;

    public function StageInvalidateTest() {
        stage.frameRate = 1;
        setTimeout(start, 1000);
    }

    private function start() : void {
        trace ("START", getTimer());

        _c = new Component("C");
        addChild(_c);

        var c2 : Component = new Component("C2");
        addChild(c2);
        c2.update();

        addEventListener(Event.RENDER, renderMain);
        stage.invalidate();
    }

    private function renderMain(event : Event) : void {
        trace ("RENDER main", getTimer());
        removeEventListener(Event.RENDER, renderMain);
        _c.update();
    }
}
public class Component extends Sprite {
    private var _name : String;

    public function Component(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component2 extends Sprite {
    private var _name : String;
    private var _timer : Timer;

    public function Component2(name : String) {
        _name = name;
        _timer = new Timer(0);
        _timer.addEventListener(TimerEvent.TIMER, handleTimer);
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        _timer.start();
        stage.invalidate();
    }

    private function handleTimer(event : TimerEvent) : void {
        trace ("--- --- TIMER", _name, _timer.currentCount, getTimer());
        _timer.stop();
        event.updateAfterEvent();
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        _timer.stop();
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component3 extends Sprite {
    private var _name : String;

    public function Component3(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        addEventListener(Event.ENTER_FRAME, enterFrame);
        stage.invalidate();
    }

    private function enterFrame(event : Event) : void {
        trace ("--- --- ENTER_FRAME", _name, getTimer());
        renderComponent(event);
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
        removeEventListener(Event.ENTER_FRAME, enterFrame);
    }
}
输出:

START 2005
UPDATE component C2 2006
RENDER component C2 2007
RENDER main 2007
UPDATE component C 2008
--- --- TIMER C 1 2021
RENDER component C 2022
看起来很漂亮,这就是我想要的。嵌套渲染及时。但我从未见过有人使用这种方法。相反,他们坚持进入帧。使用这样的计时器是否有考虑因素或副作用?计时器事件处理程序是否能够在任何情况下触发
stage.invalidate
,或者是否存在预期的副作用

2) 使用输入帧事件而不是计时器。缺点:帧速率可能较低,渲染可能会延迟

组件

public class StageInvalidateTest extends Sprite {
    private var _c : Component;

    public function StageInvalidateTest() {
        stage.frameRate = 1;
        setTimeout(start, 1000);
    }

    private function start() : void {
        trace ("START", getTimer());

        _c = new Component("C");
        addChild(_c);

        var c2 : Component = new Component("C2");
        addChild(c2);
        c2.update();

        addEventListener(Event.RENDER, renderMain);
        stage.invalidate();
    }

    private function renderMain(event : Event) : void {
        trace ("RENDER main", getTimer());
        removeEventListener(Event.RENDER, renderMain);
        _c.update();
    }
}
public class Component extends Sprite {
    private var _name : String;

    public function Component(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component2 extends Sprite {
    private var _name : String;
    private var _timer : Timer;

    public function Component2(name : String) {
        _name = name;
        _timer = new Timer(0);
        _timer.addEventListener(TimerEvent.TIMER, handleTimer);
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        _timer.start();
        stage.invalidate();
    }

    private function handleTimer(event : TimerEvent) : void {
        trace ("--- --- TIMER", _name, _timer.currentCount, getTimer());
        _timer.stop();
        event.updateAfterEvent();
        stage.invalidate();
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        _timer.stop();
        removeEventListener(Event.RENDER, renderComponent);
    }
}
public class Component3 extends Sprite {
    private var _name : String;

    public function Component3(name : String) {
        _name = name;
    }

    public function update() : void {
        trace ("UPDATE component", _name, getTimer());
        addEventListener(Event.RENDER, renderComponent);
        addEventListener(Event.ENTER_FRAME, enterFrame);
        stage.invalidate();
    }

    private function enterFrame(event : Event) : void {
        trace ("--- --- ENTER_FRAME", _name, getTimer());
        renderComponent(event);
    }

    private function renderComponent(event : Event) : void {
        trace ("RENDER component", _name, getTimer());
        removeEventListener(Event.RENDER, renderComponent);
        removeEventListener(Event.ENTER_FRAME, enterFrame);
    }
}
输出:

START 1994
UPDATE component C2 1995
RENDER component C2 1996
RENDER main 1996
UPDATE component C 1997
--- --- ENTER_FRAME C 2994
RENDER component C 2994
清楚地显示,
C
的渲染在1sek之后


再次提问:


让我的组件使用渲染事件的安全方法是什么?

不安全,Adobe仍然没有注意到这个错误。这就是为什么多年来,除了渲染事件外,每个人都使用ENTER_框架。为什么问?)你不是AS3Commons用户界面的创建者吗


最近向u发送了skype授权,顺便说一句,你在吗?

我删除了Flex标签,因为这个问题中没有特定于Flex的内容。特定于Flex的是,问题也由Flex LayoutManager处理,因此希望订阅Flex标签的Flex开发人员熟悉。没有提到Flex,或问题内容中基于Flex的类[包括layoutMAnager类]。如果您想要编辑它以包含该区别和/或使用Flex重新标记它;我不会就此与你争论。不用担心,我只是想澄清我确实有意识地设置了标记。不应该从渲染处理程序中调用invalidate;我很确定这是出于设计。我很确定这是“出于设计”,因为不应该从渲染事件处理程序中调用invalidate。