Проверьте правильность BitmapData - PullRequest
1 голос
/ 03 февраля 2011

У меня очень сложное Flash-приложение (например, Photoshop во Flash).

Существует много манипуляций с изображениями, и все работает хорошо, за исключением одной ошибки.

Приложение имеет функцию отмены / возврата, которая иногда выдает ошибку. Здесь слишком много кода для вставки, но проблема заключается в следующей строке кода:

trace("UNDO BMD: " + BeautyGlobal.undoArray[_undoSteps].bitmapData);
var newUndoData:BitmapData = BeautyGlobal.undoArray[_undoSteps].bitmapData.clone()

В отчете трассировки отображаются:

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()

Таким образом, там есть растровые данные, но они недействительны. Эта проблема не всегда возникает сама по себе. Если бы я мог определить, действительны ли данные растрового изображения, я мог бы остановить его сбой всего приложения. Я попробовал несколько вещей:

  • проверка высоты данных BM (вылетает приложение с той же ошибкой)
  • цикл через BMD для получения всех свойств ... ничего не появляется даже до того, как ошибка появляется.

Любые предложения будут с благодарностью.

Спасибо!

Ответы [ 4 ]

1 голос
/ 03 февраля 2011

Это наиболее вероятно, потому что ваше приложение использует слишком много памяти и достигло предела.Проверьте использование памяти 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() сначала.

0 голосов
/ 22 мая 2013

На всякий случай это может быть полезно: я видел эту ошибку в следующем случае: используйте словарь, чтобы сохранить слабые ссылки на объекты BitmapData (для профилирования).Затем, в некоторые моменты времени, получите доступ к свойствам ширины и высоты этих объектов BitmapData в этом словаре, чтобы вычислить общий размер выделенных BitmapData.

Как и везде в коде, bitmapData разыменовывается через: bitmapData.распоряжаться ();bitmapData = null;

В словаре указатель все еще может не быть удален сборщиком мусора.при обращении к удаленному bitmapData появляется упомянутое сообщение об ошибке.

0 голосов
/ 03 февраля 2011

вы пробовали draw() или copyPixels() вместо clone()? в любом случае грейпфрукт прав насчет блока try

0 голосов
/ 03 февраля 2011

Обертывание вашего кода клона try {} catch (e:Error){} похоже, что это предотвратит сбой вашего приложения.

Я предполагаю, что причина проблемы - нехватка памяти. Сохранение полного клона холста для каждого шага отмены становится довольно дорогим быстро. Invalid BitmapData чаще всего вызывается попыткой создания растровых изображений размером более 2880 пикселей в любом направлении (fp9, fp10 идет немного выше), но меня не удивит, если это произойдет и при проблемах с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...