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

时间:2011-05-27 18:29:44

标签: flex actionscript-3 performance drawing bitmapdata

我使用自定义Flex皮肤在浮动Panels,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的内容,但我不确定应用程序或其组件中应用这些属性(或其他我不知道的优化)的位置。

我已经解决了这个问题一段时间了,并且决定是时候伸出援手了。提前谢谢!

2 个答案:

答案 0 :(得分:2)

这个真的很有趣.. 你是否测试过添加事件监听器,例如layoutmanager用于触发重绘和 用相同的像素弯曲器着色器替换模糊滤镜?

答案 1 :(得分:1)

您应该学习如何使用Flex's lifecycle functions创建适当的Flex组件。现在,你在每一帧画画,这是非常浪费和无用的。另外,为什么需要一遍又一遍地绘制整个应用程序?

您可能还需要查看名为double buffering and bitmap blitting的技术。