BitmapData.rect创建一个新的矩形?

我今天正在研究一些blitting代码,并在分析后发现我正在创建1000个新的矩形。 我很震惊,因为我只有1或2个不同的新的Rectangle()调用,或者我正在使用BitmapData的.rect属性。

我开始评论大量的代码,直到我将这段代码留在我的sprite类中: canvas.bitmapData.copyPixels(_bitmapData, _bitmapData.rect, destination, null, null, true);

我在创建对象时缓存了_bitmapData.rect的结果,并且我的一千个新的矩形调用突然从分析器中消失了。

为什么BitmapData.rect会创建一个新的矩形? 有没有办法检查核心库或什么,并确认这是真的? 这似乎令人困惑。


Bethanny Anne说:

为什么BitmapData.rect会创建一个新的矩形? 有没有办法检查核心库或什么,并确认这是真的? 这似乎令人困惑。

想象一下下面的假设情况,即BitmapData.rect始终返回相同的Rectangle实例:

public function BitmapDataRectTest()
{
    var bmp:BitmapData = new BitmapData(100, 100, true, 0);

    var rect1:Rectangle = bmp.rect;
    rect1.width = 200;

    var rect2:Rectangle = bmp.rect;
    trace(rect2.width); // 200 <--- this would be wrong, 
                        //          the BitmapData is still only 100 pixels wide.
}

BitmapData.rect每次都会返回一个新实例,以避免出现这种情况,并确保在返回的Rectangle实例中获取正确的数据。

最后一点:这涉及'传值'(原始类型)和'传递参考'(复杂类型)变量。 欲了解更多信息检查谷歌或其他文章在计算器:通过引用或传递值?


有趣的观察。

您可以使用===运算符来检查任何Object两个实例是否相同。

BitmapData很可能在内部使用不同的数据结构来维护其视觉状态。 rect属性必须作为getter函数来实现。 但是,人们会期望,因为BitmapData的尺寸是不可变的,所以Rectangle对象永远不需要重新创建,甚至根本不需要重新计算。

编辑: BitmapData上的rect属性是只读的(无setter),但Rectangle的属性不是。 创建Rectangle的新实例可确保外部对象不能进行突变。


是的,这听起来令人沮丧,但如果你看看BitmapData类的源代码,你会发现这一点:

public class BitmapData extends Object implements IBitmapDrawable {
...
    public function get rect() : Rectangle {
        return new Rectangle(0, 0, this.width, this.height);
    }
...
}

所以答案是肯定的,AVM每次通过访问函数检索时,都会在堆中创建Rectangle的新实例。

链接地址: http://www.djcxy.com/p/20665.html

上一篇: BitmapData.rect creates a new rectangle?

下一篇: Passing object to method in java appears to be by reference (and Java is by val)