【问题标题】:BitmapData subclass and per-frame codeBitmapData 子类和每帧代码
【发布时间】:2014-03-21 15:52:50
【问题描述】:

我有一个 BitmapData 的子类,旨在充当 Stage3D 纹理的随机像素源。为了简化问题,我想添加一个函数,在将帧渲染到后台缓冲区之前按帧更新噪声。这可以通过编写如下构造函数来完成

public function NoiseTexture(stage:Stage, size:int) {
    super(size, size, true, 0);
    stage.addEventListener(Event.ENTER_FRAME, updateNoise, false, 1);
}

然后将渲染函数(也是每帧)设置为优先级 0 以确保首先执行此代码。不过,在测试这一点时,我注意到当 NoiseTexture 实例设置为 null 或重新实例化时,updateNoise 函数会继续被调用(现在在重新实例化的情况下会调用两次)——这是有道理的,因为事件侦听器被添加到外部的对象中班上。我想知道当这种情况发生时是否有一种偷偷摸摸的方法来处理从类中删除事件侦听器,或者我是否必须在外部处理。

【问题讨论】:

    标签: actionscript-3 events


    【解决方案1】:

    您可以使用弱侦听器,它在对象被取消引用时被移除。为此,请在添加事件侦听器时将 useWeakReference 参数设置为 true。

    stage.addEventListener(Event.ENTER_FRAME, updateNoise, false, 1, true);
    

    【讨论】:

    • 恒星!直到最近我一直在使用简单的事件处理——当你习惯于忽略它们时,很容易错过其中的一些属性:)
    • 小心使用弱引用。它可能会导致不可预知的结果,因为您依赖范围更改来对其进行垃圾收集。
    【解决方案2】:

    为类创建dispose|clear 方法是一种很好的做法,例如C 语言中的dealloc 方法。而且你应该使用@Vesper 提到的弱引用。

    //Some class
    public function dispose():void{
        //clear references, stop timers, remove listeners
        stage.removeEventListener(Event.ENTER_FRAME, updateNoise);
    }
    

    【讨论】:

    • 你的意思是在useWeakReference=true时释放/重新实例化时不会立即删除?
    • 它将在下一个垃圾收集周期中删除。很容易测试。
    • 明白了。在这种情况下,这无关紧要(所有侦听器所做的只是翻转一个布尔值),但对于其他应用程序,我肯定会记住这一点。再次感谢 Nicolas。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2011-08-17
    • 1970-01-01
    相关资源
    最近更新 更多