производительность флэш-памяти Internet Explorer

Я разместил это на форумах Adobe, но не жду там хорошего ответа. Я ищу помощи у кого-то, кто сделал игру во флэш-памяти и столкнулся с той же проблемой.

Шаги по воспроизведению моей проблемы:

  1. Создайте простой точечный DisplayObject во Flash

    dot.graphics.beginFill( color);
    dot.graphics.drawCircle( 0, 0, 2 );
    dot.graphics.endFill();
    
  2. Отрисовывать точку в растровое изображение много раз за кадр

    bitmapData.draw( dot, null, null, "normal", null, _smoothing );
    
  3. Тестирование FrameRate в сочетании с браузерами, версиями флеш-плагинов на Win32

Ожидать:

Частота кадров в большинстве случаев должна быть близкой

Наблюдаемый:

Я наблюдаю снижение частоты кадров в IE7 на 25% при использовании Flash10b.ocx (10.0.22) и на 50% при использовании Flash10c.ocx (10.0.32). Плагины под FireFox, Safari и Mac OSX не показывают такого же замедления.

Помоги пожалуйста:

Я хотел бы получить помощь / подтверждение о проблеме с производительностью, которую я вижу в Internet Explorer. Сообщество Adobe и Flash прекрасно работает в Интернете, но я был удивлен, когда не увидел никакой информации по этому поводу, а только несколько отчетов о воспроизведении фильмов в версиях 10.0.32 и 10.0.22.

Я предполагаю, что плагин IE flash передает вызовы отрисовки в Win32, и это медленно.

Мое решение:

Вместо того, чтобы рисовать каждый раз на растровом изображении с помощью отрисовки, кешируйте вызовы отрисовки в растровое изображение и используйте CopyPixels. Когда я так делаю, производительность в браузерах одинакова, в пределах 10%.

bitmapData.copyPixels(dot.bitmapData,dot.bitmapData.rect,new Point(dot.x,dot.y),null,null,true);

Цикл, который я использую:

function enterFrame(e:Event) {
    bitmap.lock();

    for (var i:int=0;i<particles.length;i++) {
        draw(particle[i]);
    }

    bitmap.unlock();
}

Примечания о других, возможно, «известных» проблемах, о которых я хотел бы узнать больше:

  • Сообщается, что в IE объем памяти, используемой моим приложением, намного меньше (обычно 33 МБ в flashplayer, 16 МБ в IE).
  • В IE ошибки страницы памяти превышают 10k / sec, тогда как во флеш-плеере их нет.
  • В IE stage.invalidate, похоже, вызывает проблемы с производительностью.
  • В IE установка фильтра размытия на растровое изображение имеет больший удар по производительности, чем во флэш-плеере.

person memorywar    schedule 11.11.2009    source источник


Ответы (2)


Производительность плагина Flash (сильно) различается для каждой платформы / браузера / дополнительной версии / отладчика / и т. Д. Вы мало что можете сделать, чтобы компенсировать эти различия, кроме кодирования наименьшего общего знаменателя вашей целевой аудитории.

Тем не менее, bitmapData.draw работает медленно, так как вызывает повторную растеризацию векторных данных при каждом вызове. Под капотом Flash также использует этот метод, но он отслеживает грязные области экрана, поэтому вызывает его реже, чем вы (включите в отладчике «показывать области перерисовки», чтобы увидеть это визуально).

Ваше bitmapData.copyPixels решение является правильным для реализации растров вручную. Это практически единственный механизм для получения высокопроизводительной сложной анимации во Flash.

person Cory Petosky    schedule 12.11.2009

Спасибо за подтверждение. Я думал, что цель блокировки - помочь flash минимизировать перерисовки. Я вижу заикание, хотя флеш-приложение работает со скоростью около 60 кадров в секунду.

Вместо того, чтобы люди задавались вопросом, все ли я правильно закодировал. Я модифицировал новый пример кода производительности твинлайта, чтобы он отображал линейное движение со скоростью около 150 пикселей в секунду. Это подчеркивает заикание, чтобы люди могли его увидеть. Пример находится на http://forums.greensock.com/viewtopic.php?f=1&t=1857.

person memorywar    schedule 13.11.2009
comment
Ах, это знаменитая ошибка стрижки Flash, которая присутствует в плеере с момента его появления. Нет решения или обходного пути. - person Cory Petosky; 13.11.2009