カスタム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の使用について読んだことがありますが、アプリケーションまたはそのコンポーネント内でこれらのプロパティ(または私が認識していない他の最適化)をどこに適用するのかはわかりません。
私はしばらくこの問題に遭遇しており、手を差し伸べる時間だと決めました。前もって感謝します!
応答に感謝します。はい、私はまた、移動/サイズ変更イベントでのみテストし、フィルタを完全に削除してテストしました。それはそれを殺すBitmapData.draw()呼び出しのようです。おそらく分かりやすいことですが、すべてのDisplayObjectを再描画してラスタライズするのはかなりコストがかかるためです。私は現在、効果を実行するためにPixelBenderシェーダブレンドモードを書くことを実験しています。 – Jordan
私はPixelBenderシェーダを書きましたが、透明性を備えたブレンドモードとして正しく使用することができないことがわかりました。ああ、Flexはとにかく死んでいる。いい厄介払い! – Jordan