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)