2013-08-30 6 views
0

Я попытался следующие комбинации блиттинг серии учебников Ли Brimlow и и технике в «передовой дизайн игры со вспышкой» Рекс Ван дер spuy вAS3 Blitting - медленнее, чем Movieclip. Зачем?

Я являюсь разработчиком, работающим на веб-сайте virutal мир сделал вспышку. Я сделал приложение для телефона (работает аналогично телефону в автомобильных играх с большими кражами). Во всяком случае, когда отправляется сообщение, мы хотим сыграть эту сумасшедшую анимацию конверта, летающего вокруг, и превращаясь с искрыми вокруг него. Это было лагги (особенно на старых компьютерах), поэтому я подумал, что это отличный шанс использовать блинт. Тем не менее, blitting анимация на самом деле играет медленнее, чем обычный мувиклип! Что, черт возьми, происходит здесь? Лучше ли blitting для мобильных устройств и на компьютере медленнее? Может быть, я делаю что-то неправильно. Вот мой код:

// ЭТО ЧАСТЬ ПРОИСХОДИТ, КОГДА ТЕЛЕФОН IT INITIALIZED

//**     
//---------------- Blitting stuff ---------------------------------- 
// add this bitmap stage to the display list so we can see it 
      _bitmapStage = new BitmapData(550, 400, true, 0xD6D6D6); 


     _phoneItself.addChild(new Bitmap(_bitmapStage)); 

     var _spritesheetClass:Class = getDefinitionByName("ESpritesheet_1") as Class; 
     _spritesheet = new _spritesheetClass() as BitmapData; 

     _envelopeBlit = new BlitSprite(_spritesheet, BlitConfig.envelopeAnimAry , _bitmapStage); 
     _envelopeBlit.x = -100; 
     _envelopeBlit.y = 0; 

     _envelopePlayTimer = new Timer(5, 0); 
     _envelopePlayTimer.addEventListener(TimerEvent.TIMER, onEnterTimerFrame); 
     _envelopeBlit.addEventListener("ENV_ANIM_DONE", onEnvAnimFinished); 

// "BlitSprite" это класс, который я сделал. Это выглядит так:

int = 0; частный var _count: int = 0;

public var animate:Boolean = true; 
    private var _whiteTransparent:BitmapData; 
    private var _envelopeAnimAry:Array; 
    private var _model:Object; 



    public function BlitSprite(fullSpriteSheet:BitmapData, envelopeAnimAry:Array, bitmapStage:BitmapData, model:Object = null) 
    { 
     _fullSpriteSheet = fullSpriteSheet; 
     _envelopeAnimAry = envelopeAnimAry; 
      _bitmapStage = bitmapStage; 
      _model= model; 

      init(); 
     } 

     private function init():void 
     { 
//   _whiteTransparent = new BitmapData(100, 100, true, 0x80FFffFF); 

      this.addEventListener("ENV_ANIM_DONE", onEvnAnimDone); 

     }  

     protected function onEvnAnimDone(event:Event):void 
     { 

     }  

     public function render():void 
     { 

//   pos.x = x - _rects[_animIndex].width*.5; 
//   pos.y = y - _rects[_animIndex].width*.5; 

//   if (_count % 1 == 0 && animate == true) 
//   { 

//    trace("rendering"); 

       if (_animIndex == (_envelopeAnimAry.length - 1)) 
       { 
//     _animIndex = 0; 
        dispatchEvent(new Event("ENV_ANIM_DONE", true)); 
        animate = false; 
//     trace("!!!!animate over " + _model.animOver); 

//     if (_model != null) 
//     { 
//      _model.animOver = true; 
//     } 

//     trace("!!!!animate over " + _model.animOver); 

       } 

       else 
       { 
        _animIndex++; 
       } 


       pos.x = x + _envelopeAnimAry[_animIndex][1]; 
       pos.y = y + _envelopeAnimAry[_animIndex][2]; 


       _bitmapStage.copyPixels(_fullSpriteSheet, _envelopeAnimAry[_animIndex][0], pos, null, null, true); 

     } 



    } 
} 




// THIS PART HAPPENS WHEN PHONE'S SEND BUTTON IS CLICKED 


       _envelopeBlit.animate = true; 
       _envelopeBlit._animIndex = 0; 
       _darkSquare.visible = true; 
       _envelopePlayTimer.addEventListener(TimerEvent.TIMER, onEnterTimerFrame); 
       _envelopePlayTimer.start(); 

он также использует BlitConfig, который хранит информацию о spritesheet выплюнуть по TexturePacker

package com.fs.pack.phone.configuration 
    { 
     import flash.geom.Rectangle; 

     public final class BlitConfig 
     { 




      public static var _sending_message_real_20001:Rectangle = new Rectangle(300,1020,144,102); 
      public static var _sending_message_real_20002:Rectangle = new Rectangle(452,1012,144,102); 
      public static var _sending_message_real_20003:Rectangle = new Rectangle(852,852,146,102); 
      public static var _sending_message_real_20004:Rectangle = new Rectangle(2,1018,146,102); 
      public static var _sending_message_real_20005:Rectangle = new Rectangle(702,822,148,102); 
. 
. 
. 
public static var _sending_message_real_20139:Rectangle = new Rectangle(932,144,1,1); 

    public static var envelopeAnimAry:Array = [ 

       // rectangle, x offset, y offset 
      [ _sending_message_real_20001, 184,155], 
      [ _sending_message_real_20002, 184,155], 
      [ _sending_message_real_20003, 183,155], 
      [ _sending_message_real_20004, 183,155], 
. 
. 
. 
[ _sending_message_real_20139, 0,0] 
     ] 



     public function BlitConfig() 
     { 
     } 


    } 
} 

ответ

0

EDIT: Зная, что это не мобильный, мой ответ ниже не имеет значения. Я оставлю его там, хотя на случай, если у кого-то возникнут проблемы с blitting на мобильном телефоне в будущем.

Что касается этого конкретного вопроса, вы запускаете свой таймер каждые 5 мс. Во-первых, самый низкий диапазон, который таймер является точным, составляет> 15 мс, поэтому никогда не будет жизнеспособным решением. Для любого таймера, связанного с отображением soemthing на сцене, вы должны никогда сделать это меньше, чем один кадр. (1000/stage.framerate. ~ 40 мс для приложения 30 кадров в секунду)

Для достижения цели, чтобы уменьшить расчеты и рендеринг. Как вы сейчас это настроили, похоже, вы бьете каждые 5 мс. Это на самом деле более чем в 8 раз чаще, чем MovieClip. Вы должны уменьшить, как часто вы blit. Делайте это только тогда, когда изменение действительно было сделано за пределами перевода. Делать это не чаще, чем это является излишеством, и причина, это так медленно (опять же, создание растровых изображений медленно)


В общем, вы не хотите, чтобы блитирования в AIR для мобильных приложений (которые я предполагаю, вы делаете, так как вы упомянули, что телефон был инициализирован). Я не уверен, что все в порядке, используя другие/родные SDK, но избегайте их в AIR.

По существу, дело сводится к тому, как блиты работают. Blitting берет захват экрана и отображает это на сцене, а не на фактическом объекте. В общем, это здорово. Это означает, что ваши отображаемые объекты, особенно векторы, которые медленно визуализируются, должны отображаться гораздо реже. Это особенно хорошо при анимации, потому что объект имеет тенденцию к повторной визуализации каждый раз, когда он каким-либо образом переводится, но не является растровым изображением.

На мобильных платформах, однако, создание этого растрового изображения невероятно медленно. Я никогда не задумывался о том, как SDK создает растровые изображения, но он не делает это эффективно (часто меня заставляет задуматься, делает ли он пиксель за пикселем). На настольных компьютерах это нормально.Существует много CPU и много оперативной памяти, чтобы это произошло быстро. Однако на мобильном телефоне этой роскоши нет. Поэтому, когда вы blit и создаете это растровое изображение, для выполнения этого процесса требуется некоторое время.

Проблема усугубляется на экранах с высоким разрешением. Приложение, которое я разработал с января по май этого года, выборочно использовал blitting для использования фильтров в ускоренной среде GPU. На iPad 2, blitting принял мое приложение от 30fps до ~ 24fps. Не большое дело, не то, что пользователь заметил бы. Однако на iPad 3 с дисплеем сетчатки он упал до 10 кадров в секунду. Это имеет смысл, когда вы думаете об этом, так как сетчатки iPads имеют в 4 раза больше пикселей, чем iPad.

Если вы хотите использовать блиттинг на мобильный, я рекомендую несколько вещей:

  1. Использование режима рендеринга GPU. Без этого у вас нет шансов. Помните, что, по крайней мере, с предварительным AIR 3.7 фильтры не поддерживались в режиме GPU. Я не уверен, что это все еще так. Однако вам следует избегать использования фильтров на мобильных устройствах, поскольку они очень медленны для рендеринга
  2. Обязательно протестируйте приложение режима выпуска. В зависимости от настроек сборки разница между режимом отладки и приложением режима выпуска может быть существенной, особенно на iOS. Приложение, которое я только что разработал, заняло 2-3 секунды, чтобы создать новый Flex View в режиме отладки менее чем на фрейм (~ 40 мс), чтобы сделать это в режиме деблокирования на iPhone 4
  3. Использовать блинтичающе экономно. Делайте это только там, где это абсолютно необходимо
  4. Ищите способы упростить список отображения. Для создания кнопки с 40 детьми легко создать кнопку. Вместо этого ищите способы упростить это на меньшее количество объектов и меньше фильтров (даже если удаление фильтра требует добавления другого объекта). Я не думаю, что это поможет с фактическим процессом блиттинга, но это должно помочь с рендерингом объектов в первую очередь.

Так что, в общем, используйте blitting на мобильном телефоне, потому что создание растрового изображения происходит медленно.

+0

Это не в AIR. Это просто swfs загружается на сервер, который будет воспроизводиться в браузере, и да, он медленнее здесь, на очень быстром компьютере. – Fans

+0

Вы говорите: «ЭТОТ ЧАСТЬ ПРОИСХОДИТ, КОГДА ТЕЛЕФОН ИНИЦИАЛИЗИРОВАН» был определенно обманчив. См. Мое редактирование в верхней части ответа –

+0

Да, извините. Обычно я начинаю каждый класс с помощью метода init(); внутри конструктора, поэтому «инициализация телефона» в основном означает все то, что он делает, когда оно загружается в мир, но до любого взаимодействия с пользователем. Он действительно говорит, что это виртуальный виртуальный мир в Интернете. – Fans

 Смежные вопросы

  • Нет связанных вопросов^_^