Actionscript 3 BitmapData子类和每帧代码

Actionscript 3 BitmapData子类和每帧代码,actionscript-3,events,Actionscript 3,Events,我有一个BitmapData的子类,用于作为Stage3D纹理的随机像素源。为了简化问题,我想添加一个函数,在将帧渲染到后缓冲区之前以每帧为基础更新噪波。这可以通过如下编写构造函数来实现 public function NoiseTexture(stage:Stage, size:int) { super(size, size, true, 0); stage.addEventListener(Event.ENTER_FRAME, updateNoise, false, 1);

我有一个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函数将继续被调用(现在在重新实例化的情况下调用两次)——这是有意义的,因为事件侦听器被添加到类外部的对象中。我想知道当发生这种情况时,是否有一种偷偷摸摸的方法来处理从类中删除事件侦听器的问题,或者我是否必须从外部处理该问题。

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

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

为类创建
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时,它不会在释放/重新实例化时立即删除?它将在下一个垃圾收集周期中删除。这很容易测试,明白了。在本例中,这不重要(侦听器所做的只是翻转一个布尔值),但对于其他应用程序,我肯定会记住这一点。再次感谢你,尼古拉斯。