BitmapDataのdrawメソッドとFlashPlayer9の問題

Filed under AS3, Flash
Tagged as ,

いやー、またもやFlashのコーディングでハマりました!ということで、ハマった原因と対策をトラブルシューティングとしてまとめてみました。

Flash Player 9で落ちる

BitmapDataのdrawメソッドを使っている箇所で、特定の条件を満たすとFlashPlayerがおちることがある問題にぶつかりました。
特定条件とは、以下の4点です。

  • 描画ターゲット(drawメソッドの第1引数に渡すオブジェクト)内にTextFieldがある
  • FlashPlayerのバージョンが9である
  • drawメソッドでBlendModeをnull以外に指定する
  • drawメソッドを2回以上呼び出す

Flash Player 10以降では落ちないので、ユーザー環境のターゲットが10以降の場合には問題になりません。Flash Player 10の普及率も8割以上らしいので、もうあんまり問題にならないような気もしますが、苦闘メモとして残しておきます。
また、4点目に書いていますが、一回drawしただけでは落ちないけど、毎フレームdrawすると2フレーム目のdrawで落ちるので、これもプロジェクト次第ですね。

検証してみた

症状を再現するためにテストファイルを作ってみました。以下のようにして再現させることができます。

  • TextFieldを作成し、_textFieldと名付ける。
  • そのTextFieldを含むMovieClip(TextFieldMC)を作成し、_mcと名付ける。
  • TextFieldMCの基本クラスをTextSpriteとし、後述するコード(TextSprite.as)を作成。
  • root上にBitmapインスタンスを_targetとして作成し、そのBitmapData上に_mcを描画するコードを書きます。

TestBmpdDraw
このようにして作成したflaファイルと一緒に、エントリ末に示すコードを記述・準備・リンケージ設定すると、再現できます。

対応策

対応策ですが、TextFieldを含む描画オブジェクト(上記例で言うところの_mc)のcacheAsBitmapをtrueにすると落ちなくなります
また、この対策と同様の対策として、間にもう一つBitmapDataを挟む方法もあります。試してみましたが、うまく動作しました。(上記例で言うと、_mcを一度別のBitmapDataにBlendMode抜きで描画し、そのBitmapDataをBlendModeをつけて_targetに描画する、という流れになります。)
とりあえず、対策方法を見つけ出せて一安心!でした。

テストコード

以下に、上記例で使用したコードを二つ載せておきますので、デバッグの際には参考にしてみてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// TestBmpdDrawRoot.as
package {
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.BlendMode;
  import flash.display.Sprite;
  import flash.events.Event;
 
  public class TestBmpdDrawRoot extends Sprite {
    public var    _mc:TextSprite;
    public var    _target:Bitmap;
    public var    _targetData:BitmapData;
 
    // コンストラクタ.
    public function TestBmpdDrawRoot(){
      _targetData    = new BitmapData( _mc.width, _mc.height );
      _target    = new Bitmap( _targetData );
      addChild( _target );
      _target.x    = 5;
      _target.y    = 5;
 
      addEventListener( Event.ENTER_FRAME, process, false, 0, true );
    }
 
    private function process(e:Event):void {
      _targetData.draw( _mc, null, null, BlendMode.LAYER );  // NG.
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// TextSprite.as
package {
  import flash.display.Sprite;
  import flash.text.TextField;
 
  public class TextSprite extends Sprite {
    public var	_textField:TextField;
 
    // コンストラクタ.
    public function TextSprite()
    {
      //cacheAsBitmap	= true; // OK.
    }
  }
}

[AD]

詳説 ActionScript 3.0

著者/訳者:Colin Moock

出版社:オライリージャパン( 2008-11-22 )

定価:¥ 6,090

Amazon価格:¥ 6,090

大型本 ( 1044 ページ )

ISBN-10 : 4873113873

ISBN-13 : 9784873113876


Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*