2011-05-27 16 views
2

カスタムFlexスキンを使用して、フローティングパネル、TitleWindows、およびその他のコンテナの背景にアクティブなぼかし/フロストガラス効果を作成していますhttp://www.pixelfumes.com/blog/apr07/activeBlurClass.html)。アプリケーションスキンには背景画像があり、アクティブなぼかしコンポーネントの上下には任意の数の他のコンポーネントがあります。ここでは皮膚内のいくつかの関連するコードです:AS3/Flex:BitmapData.draw()を使用して描画アプリケーションのパフォーマンスを改善する

public static const BLUR_FILTER :BlurFilter = new BlurFilter(16, 16, BitmapFilterQuality.HIGH); 

private var _bitmapFill :BitmapFill = new BitmapFill; 

private var _matrix :Matrix = new Matrix; 

protected function handleEnterFrameEvent (event :Event) :void { 

    var bitmapData :BitmapData, 
     matrix :Matrix; 

    // only run if component has width and height 
    if (unscaledWidth && unscaledHeight) { 
     bitmapData = new BitmapData(unscaledWidth, unscaledHeight, false); 
     // use the component's transform matrix to source the area to draw 
     matrix = transform.concatenatedMatrix; 
     _matrix.tx = -matrix.tx; 
     _matrix.ty = -matrix.ty; 
     // hide component to draw what's behind it 
     visible = false; 
     // this is the performance hit: draw the application to a bitmap 
     bitmapData.draw(IBitmapDrawable(parentApplication), _matrix); 
     visible = true; 
     bitmapData.applyFilter(bitmapData, bitmapData.rect, new Point, BLUR_FILTER); 
     _bitmapFill.source = bitmapData 
     backgroundRect.fill = _bitmapFill; 
    } 

} 

残念ながら、これのパフォーマンスは、コンポーネントのサイズが変更されている、と移動する場合は特に、貧しい人々です。顕著なドラッグ遅延と全体的な減速があります。これは、テストアプリケーションでは1つのポップアップタイトルウィンドウしかありません。 TitleWindow内のコンポーネントが変更されたとき(ボタンホバー状態など)、特にパフォーマンスが悪いです(ボタンホバー状態など)

ぼかしフィルタ、ビットマップ塗りつぶし、およびマトリックスの再インスタンス化を避けることによって少し最適化しようとしましたが、効果がほとんどまたはまったくなかった。私は一点でぼかしを削除し、アプリケーションをビットマップに描画するだけで、パフォーマンスはまだ悪いので、BitmapData.draw()呼び出しが主であることは明らかです。

私はscrollRectとcacheAsBitmapの使用について読んだことがありますが、アプリケーションまたはそのコンポーネント内でこれらのプロパティ(または私が認識していない他の最適化)をどこに適用するのかはわかりません。

私はしばらくこの問題に遭遇しており、手を差し伸べる時間だと決めました。前もって感謝します!

答えて

2

これは本当に面白いです。 たとえば、レイアウトマネージャーで、redrawをトリガーするlayoutmanagerを追加しました。 ぼかしフィルターを同じピクセルベンダーシェーダーに置き換えましたか?

+0

応答に感謝します。はい、私はまた、移動/サイズ変更イベントでのみテストし、フィルタを完全に削除してテストしました。それはそれを殺すBitmapData.draw()呼び出しのようです。おそらく分かりやすいことですが、すべてのDisplayObjectを再描画してラスタライズするのはかなりコストがかかるためです。私は現在、効果を実行するためにPixelBenderシェーダブレンドモードを書くことを実験しています。 – Jordan

+1

私はPixelBenderシェーダを書きましたが、透明性を備えたブレンドモードとして正しく使用することができないことがわかりました。ああ、Flexはとにかく死んでいる。いい厄介払い! – Jordan

1

Flex's lifecycle functionsを使用して、適切なFlexコンポーネントを作成する方法を学ぶ必要があります。今は、すべてのフレームで描画していますが、これは非常に無駄で無駄です。また、アプリケーション全体を何度も何度も描画する必要があるのはなぜですか?

また、double buffering and bitmap blittingというテクニックも参考にしてください。

+0

お返事ありがとうございます。これはコンポーネントではなく、スキンの内部にあります。残りのスキンはstyleChanged()、invalidate/commitProperties()、invalidate/updateDisplayList()の組み合わせで描画/スタイルされています。このコンポーネントでは、各サイクルの後ろにあるものを描画する必要があります。私は、enterFrameを使用することは、移動していないコンポーネントにとっては無駄であることを理解しています。しかし、これらのアクティブなぼかしウィンドウのいくつかは、動くコンテンツ上に表示されることがあるので、頻繁に更新する必要があり、したがって、enterFrameリスナを更新する必要があります。 – Jordan

+0

アプリケーション全体を描画するのは、アクティブなぼかしが適用されているウィンドウ/コンポーネントの背後にあるものだけを描画する方法を見つけるのが大好きですが、これを行う方法はわかりません。私はあなたが提供したリンクを読み上げ、再度感謝します。 – Jordan

+0

JAXは、コンポーネントをスキンに設定するためにコンポーネントのサイズを変更しても、これをエンタープライズフレームイベントから取得するようにしてください。 –

関連する問題