AS3 / Flex:使用BitmapData.draw()改善绘图应用程序的慢速性能

|| 我正在使用自定义Flex皮肤在浮动面板,TitleWindows和其他容器(类似于http://www.pixelfumes.com/blog/apr07/activeBlurClass.html)的背景上创建活动的模糊/蒙砂玻璃效果。 “应用程序”外观中有一个背景图像,并且在活动模糊组件上方和下方可能有任意数量的其他组件。这是皮肤中的一些相关代码:
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;
    }

}
不幸的是,在调整组件大小时,尤其是在移动组件时,这种方法的性能很差。有明显的拖动延迟和整体速度下降,并且测试应用程序中只有一个弹出的TitleWindow。更改TitleWindow内的组件(按钮悬停状态等)时,性能特别差。 我尝试通过避免重新实例化模糊滤镜,位图填充和矩阵来进行一些优化,但这几乎没有效果。我一度消除了模糊,只是将应用程序绘制到位图上,并且性能仍然很差,因此很明显它主要是BitmapData.draw()调用。 我已经读过有关使用scrollRect和cacheAsBitmap的信息,但是我不确定在应用程序或其组件中将这些属性(或我不知道的其他优化)应用于何处。 我遇到这个问题已有一段时间了,因此决定是时候伸出援手了。提前致谢!     
已邀请:
        这个真的很有趣。 您是否测试过添加事件监听器,例如用于触发重绘的layoutmanager和 用相同的pixelbender着色器替换模糊滤镜?     
        您应该学习如何使用Flex的生命周期功能创建适当的Flex组件。现在,您正在绘制每一个帧,这非常浪费且无用。另外,为什么还要一遍又一遍地绘制整个应用程序? 您可能还想看看一种称为双缓冲和位图blitting的技术。     

要回复问题请先登录注册