我有一个非常复杂的Flash应用程序(想想Flash中的Photoshop)。
有很多图像处理,除了一个bug外,一切都运行良好。
应用程序具有撤消/重做功能,有时会抛出错误。这里有太多的代码要粘贴,但问题围绕着这行代码:
trace("UNDO BMD: " + BeautyGlobal.undoArray[_undoSteps].bitmapData);
var newUndoData:BitmapData = BeautyGlobal.undoArray[_undoSteps].bitmapData.clone()
trace语句显示:
UNDO BMD: [object BitmapData]
ArgumentError: Error #2015: Invalid BitmapData.
at flash.display::BitmapData/clone()
at Main/undoAction()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.beautyCanvas.ui::Toolbar/undoClick()
那里有bitmapdata,但它无效。此问题并非始终预设。如果我能检测到位图数据是否有效,我可以阻止它崩溃整个应用程序。我尝试了一些事情:
任何建议都将不胜感激。
谢谢!
答案 0 :(得分:1)
这很可能是因为您的应用程序使用了太多内存并且达到了极限。检查Flash Player的内存使用情况。
捕获和处理此错误的一种方法是简单地使用try..catch
块:
try {
var newBitmapData:BitmapData = oldBitmapData.clone();
} catch (e:Error) {
if (e.errorID == 2015) {
// handle it
} else {
throw e;
}
}
如果你一直遇到这个错误,并且可以确认确实存在与内存使用量增加的关联,那么你首先想要做的就是确保你正确处理任何丢弃的BitmapData
个对象:
// dispose first
myBitmapData.dispose();
myBitmapData = null;
在丢失对BitmapData实例的所有引用之前,您需要先dispose()
它。
答案 1 :(得分:0)
使用try {} catch (e:Error){}
包装您的克隆代码似乎会阻止您对应用程序进行崩溃。
我猜这个问题的原因是内存不足。为每个撤消步骤保持画布的完整克隆变得相当昂贵。 Invalid BitmapData
最常见的原因是尝试在任一方向上创建大于2880px的位图(fp9,fp10稍微高一点),但如果在内存相关问题中也会出现这种情况,我也不会感到惊讶。
答案 2 :(得分:0)
您是尝试draw()
还是copyPixels()
而不是clone()
?无论如何,grapefrukt对于try
区块是正确的
答案 3 :(得分:0)
以防这可能会有所帮助:我在下一种情况下看到了这个错误: 使用字典来保持对正在使用的BitmapData对象的弱引用(用于分析 目的)。 然后,在某些时间点,访问该字典中这些BitmapData对象的width和heigth属性,以计算分配的BitmapData的总大小。
与代码中的其他地方一样,bitmapData通过以下方式解除引用: bitmapData.dispose(); 位图数据= NULL;
在字典中,垃圾收集器可能还没有删除指针。 访问处理的bitmapData似乎给出了上述错误消息。