2011-02-03 23 views
1

私は非常に複雑なFlashアプリケーションを持っています。BitmapDataが有効であることを確認してください

画像操作がたくさんあり、1つのバグを除いてすべてがうまくいきます。

アプリケーションには、元に戻す/やり直し機能があり、ときどきエラーが発生します。そこここに貼り付けるあまりにも多くのコードがありますが、問題は、このコード行を中心に展開:

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ありますが、それは有効ではありません。この問題は、あらかじめ設定されているわけではありません。ビットマップデータが有効かどうかを検出できれば、アプリケーション全体がクラッシュするのを防ぐことができます。私はいくつかのことを試してみました:

  • は、すべてのプロパティを取得するためにBMDをループBMデータ(同じエラーでアプリがクラッシュ)
  • の高さを確認...何も前に来るんエラーが発生します。

ご意見をいただければ幸いです。

ありがとうございます!

+0

try {...あなたの通常のメソッド...} catch(エラー:ArgumentError){...代替メソッド...}? –

答えて

1

これは、アプリケーションが多すぎるメモリを使用しており、限界に達した可能性が高いためです。 Flash Playerのメモリ使用量を確認してください。そして、あなたはこのエラーに実行し続けると増加メモリ使用量との相関が実際に存在することが確認できた場合

try { 
    var newBitmapData:BitmapData = oldBitmapData.clone(); 
} catch (e:Error) { 
    if (e.errorID == 2015) { 
    // handle it 
    } else { 
    throw e; 
    } 
} 

このエラーをキャッチして対処する方法は、単にtry..catchブロックを使用することですあなたがBitmapDataインスタンスへのすべての参照を失う前に、あなたがしたい

// dispose first 
myBitmapData.dispose(); 

myBitmapData = null; 

:あなたが最初にやりたいことの一つは、あなたが適切に破棄されたBitmapDataオブジェクトを処分されていることを確認しています最初に210。

+0

優秀な先端!ありがとう。 – drpelz

0

try {} catch (e:Error){}でクローンコードをラップすると、アプリがクラッシュするのを防ぐことができます。

私は、問題の原因がメモリ不足であると推測します。元に戻すステップごとにキャンバスの完全なクローンを維持すると、かなり高価になります。 Invalid BitmapDataは、どちらの方向にも2880pxより大きいビットマップを作成しようとすると最もよく発生しますが(fp9、fp10は少し高くなります)、これもメモリー関連の問題で発生しても驚かないでしょう。

0

またはcopyPixels()clone()の代わりにdraw()を試しましたか?とにかくgrapefruktは、tryブロックについて正しくあります。

0

は、念のために、これは役に立つことができます は( 目的をプロファイリングするために)使用中のBitmapDataオブジェクトへの弱い参照を維持するために辞書を使用します。私は、このエラーは次の場合に表示されます見てきました。 次に、ある時点で、その辞書内のBitmapDataオブジェクトのwidthおよびheigthプロパティにアクセスして、割り当てられたBitmapDataの合計サイズを計算します。

コードの他の部分と同様に、bitmapDataは次のように参照されます。 bitmapData.dispose(); bitmapData = null;

辞書では、ポインタがまだガベージコレクタによって削除されていない可能性があります。 、配置されたbitmapDataにアクセスすると、前述のエラーメッセージが表示されます。

関連する問題