サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

MovieClip._alphaの処理について

ID: FN0507002 Product: Flash

Platform: All
Version: 5.0 and above


アルファを設定したエレメントの描画は、Flashの中でも負荷の高い処理です。それは、画面のピクセルを描画するために、そのエレメントだけでなく背景のピクセル情報も必要になるからです。この点は、アニメーションの処理が、トゥイーンかスクリプトかを問いません。本稿ではスクリプトによるMovieClip._alphaプロパティの処理について、いくつか注意すべき点を述べます。


1. MovieClip._alphaは0でも負荷が発生
MovieClip._alphaプロパティの値が0なら完全な透明です。したがって、そのインスタンスは存在しないものとして、処理すればよさそうに思われます。しかし実際には、Flashは背景のピクセル情報との合成処理を行っているようです。

実際、16bitカラーのディスプレイでは、アルファを0に設定したエレメントの輪郭がうっすら見えてしまうという問題が発生します[*1]。これは、アルファが0であっても、エレメントの描画処理は行われていることを示します。

したがって、CPUの負荷を軽減するためには、アルファが0のまま放置されるインスタンスをなるべく減らした方がよいといえます。具体的には、代わりにMovieClip._visibleプロパティをfalseに設定するか、ステージ外に配置してしまう方法が考えられます[*2]。外部SWFをMovieClipインスタンスにロード(MovieClip.loadMovie()またはloadMovie())する場合は、読込み時にMovieClip._visibleプロパティは一旦trueにリセットされてしまうので、後者が有効でしょう。

さらに、そのMovieClipインスタンスが2度と表示する必要のないものであれば、MovieClip.removeMovieClip()メソッドでインスタンスを完全に削除してしまう方が、負荷はより軽減できます。

なお、アルファの設定されたインスタンスを多数重ねると、CPU負荷が高くなるだけでなく、正しく表示されないこともあります[*3]。表現の内容をよく検討して、同じフレームの中でアルファを同時に使用するエレメント数は最小限に抑えることが大切です。

[*1] 問題の内容とその対処方法については、Flashテクニック「HighColor(15bit,16bitカラー)時の色ズレを回避する方法」をご参照ください。。

[*2] Flashcoders「work area size」(Gregory Burch氏の投稿)は、同旨を述べています。

[*3] F-site「画質の違いは、アンチエイリアス以外にも影響する」(宮地成太郎氏)は、アルファの設定された多数のインスタンスを重ね合わせて配置した場合に、高画質時のレンダリングが悪化するという現象を報告しています。また、関連する問題として、FLASH-japan「透過PNGが表示されない」では、「透過PNGを10数枚重ねると、下にあるPNGが表示され」ないという問題が議論されました。


2. MovieClip._alphaプロパティの内部処理は256諧調
MovieClip._alphaプロパティの単位はパーセンテージ、つまり0から100までの値です。ユーザーインターフェイスを見ると、[カラーミキサー]パネルはRGBが256諧調、アルファは100%を基準にしています(図001)。

図001■カラーミキサーのアルファは100%基準

しかし、[プロパティインスペクタ]でインスタンスの[カラースタイル]に[詳細]を選択したとき、[拡張効果]のオフセットはアルファも256諧調で設定することになっています。この値は、ColorクラスのColor.getTransform()Color.setTransform()メソッドでも使用されます。

図002■拡張効果のオフセットは256諧調

MovieClip._alphaプロパティの内部処理には、256諧調が用いられている様子です。たとえば、MovieClip._alphaプロパティに70%を代入して、実際に設定された値をプロパティから調べると、69.921875%という半端な値になっています。しかし、256諧調(1/256)を基準に換算すれば、179(179/256)という切りのいい数値であることがわかります(表001)。

表001■10%刻みで設定したMovieClip._alphaの実際の値と256諧調換算値
_alphaに設定した値
実際の_alpha値
256諧調に換算した値
100%
100%
256/256
90%
89.84375%
230/256
80%
79.6875%
204/256
70%
69.921875
179/256
60%
59.765625%
153/256
50%
50%
128/256
40%
39.84375%
102/256
30%
29.6875%
76/256
20%
19.921875%
51/256
10%
9.765625%
25/256
0%
0%
0/256

256諧調に換算した値に半端が出ると、その端数は切捨てられます。すなわち、つねに「整数値/256」の値に丸められます。ですからたとえば、1/256つまり0.390625%未満の少数値を加算しても、MovieClip._alphaプパティの値は変化しません。以下のスクリプトをMovieClipシンボルのフレームアクションに設定しても、MovieClip._alphaの値は0のまま変わりません。

スクリプト001■MovieClip._alphaに1/256未満の値を加えても変化しない

// MovieClip: MovieClip._alphaプロパティ値を変化させるインスタンス
// フレームアクション
this._alpha = 0;
this.onEnterFrame = function():Void {
   this._alpha += 0.39;   // 1/256(=0.390625%)より小さい値を加算
   trace(this._alpha);   // 出力: 0 <- ずっと変わらない
}

設定値をMovieClip._alphaプロパティに反映させるには、加算する値を1/256以上にするか、加算後の累計値を変数に保持してその値を設定する必要があります。つぎのスクリプト002は、プロパティに設定する累計値を変数に保持したうえで、その変数値をMovieClip._alphaプロパティに代入しています。

スクリプト002■加算した累計値を変数に保持したうえでMovieClip._alphaの値を設定

// MovieClip: MovieClip._alphaプロパティ値を変化させるインスタンス
// フレームアクション
var nAlpha:Number = this._alpha=0;   // 累計値を保持する変数を設定
this.onEnterFrame = function():Void {
   this._alpha = nAlpha += 0.39;   // 加算後の累計値を変数に代入
   if (nAlpha>=100) {
     delete this.onEnterFrame;
   }
};


3. MovieClip._alphaプロパティの取り得る値
MovieClip._alphaプロパティとして有効な値は、0以上100以下の数値です。しかし、実際上マイナスの値や100を超える数値も設定することはできます。もちろん、表示上マイナスの値は0と同じく完全な透明で、100を超える値も完全な不透明として100と異なるところはありません。

ただし、その値の範囲は-12800以上12800未満で管理されているようです。MovieClip._alphaプロパティに12800を代入すると、その値は-12800に変換されて設定されます。また、-12801を設定しようとすれば、プロパティ値は12799(厳密には12799.21875)に変わります。

以下のフレームアクションをMovieClipインスタンスに設定すると、12800以上や-12800未満の値が変換されることを[出力]パネルで確認でき、またMovieClipインスタンスの完全不透明と完全透明が反転して点滅するアニメーションになります。

スクリプト003■MovieClip._alphaに範囲外の値を設定

// MovieClip: MovieClip._alphaプロパティ値を変化させるインスタンス
// フレームアクション
var nAlpha:Number = 12800;
var nIncrements:Number = 1;
this.onEnterFrame = function():Void {
  this._alpha = nAlpha;
  trace([nAlpha, this._alpha]);
  nAlpha += nIncrements;
  if (nAlpha*this._alpha<0) {
    nIncrements *= -1;
    nAlpha = Math.floor(this._alpha);
  }
};

スクリプティングの実践としては、MovieClip._alphaプロパティに設定する値は、0から100までの範囲に限定することが安心だと考えられます。


関連項目
MovieClip._alphaの微調整ができない/値が端数になる

_____

作成者: 野中文雄
更新日: 2007年11月15日 3.を追加。若干の加筆・補正。
更新日: 2006年4月28日 関連項目を追加
作成日: 2005年7月31日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.