AS3 / Flex: повышение медленной производительности рисования приложения с использованием BitmapData.draw () - PullRequest
2 голосов
/ 27 мая 2011

Я использую собственную обложку 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, но я не уверен, где применять эти свойства (или другие оптимизации, которые мне неизвестны) в Приложении или его компонентах.

Я некоторое время занимался этой проблемой и решил, что пришло время протянуть руку. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

это действительно интересно .. Вы тестировали добавление списков событий, например, layoutmanager для запуска перерисовки и замены фильтра размытия тем же шейдером pixelbender?

1 голос
/ 27 мая 2011

Вы должны научиться создавать надлежащие компоненты Flex, используя Функции жизненного цикла Flex .Прямо сейчас вы рисуете на каждом кадре, что крайне расточительно и бесполезно.Кроме того, зачем вам нужно рисовать все приложение снова и снова?

Возможно, вы захотите также взглянуть на методику, называемую двойная буферизация и растровое растрескивание .

...