我使用自定义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的内容,但我不确定应用程序或其组件中应用这些属性(或其他我不知道的优化)的位置。
我已经解决了这个问题一段时间了,并且决定是时候伸出援手了。提前谢谢!
答案 0 :(得分:2)
这个真的很有趣.. 你是否测试过添加事件监听器,例如layoutmanager用于触发重绘和 用相同的像素弯曲器着色器替换模糊滤镜?
答案 1 :(得分:1)
您应该学习如何使用Flex's lifecycle functions创建适当的Flex组件。现在,你在每一帧画画,这是非常浪费和无用的。另外,为什么需要一遍又一遍地绘制整个应用程序?
您可能还需要查看名为double buffering and bitmap blitting的技术。