Выполнение жадных алгоритмов без потери FPS. Chunker.as

Готовый рецепт. Давайте представим, у нас есть очень тяжелый нелинейный алгоритм, сложность которого выше чем N. Грант Скиннер, написал класс Chunker.as, который предоставляет возможность вызывать функцию не каждый ENTER_FRAME, а через определенный промежуток времени.
Для того, чтобы выполнить наш алгоритм, необходимо представить его в виде функции, передать интервал, параметры, которые принимает функция.

var chunker:Chunker = new Chunker(time, method, params:Object);

Данный метод я использую в игровом проекте для преждевременного моделирования сцены(жду пока все объекты упадут на свои позиции), во время моделирования у пользователя на экране отображается загрузка. Очень удобно применять для обработки данных и выполнения математических операций.

Chunker.as

/**
* Chunker by Grant Skinner. Sep 22, 2009
* Visit www.gskinner.com/blog for documentation, updates and more free code.
*
*
* Copyright (c) 2009 Grant Skinner
* 
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
**/
package com.gskinner.utils {
   import flash.display.Shape;
 import flash.events.Event;
  import flash.utils.getTimer;
    public class Chunker {
 
        static protected var shape:Shape;
 
    // Constants:
 
    // Public Properties:
       public var method:Function;
     public var time:uint;
       public var data:Object;
 
    // Protected Properties:
        protected var _paused:Boolean;
 
    // Initialization:
      public function Chunker(time:uint, method:Function, data:Object=null) {
         if (shape == null) { shape = new Shape(); }
         this.time = time;
           this.method = method;
           this.data = data;
           paused = false;
     }
 
        public function get paused():Boolean 
       {
           return _paused;
     }
 
        public function set paused(value:Boolean):void 
     {
           _paused = value;
            if (value) { shape.removeEventListener(Event.ENTER_FRAME, tick); }
          else 
           {
               shape.addEventListener(Event.ENTER_FRAME, tick); 
           }
       }
 
        public function tick(evt:Event):void 
       {
           var t:uint = getTimer();
            while (getTimer() < t+time && !_paused) { method(this); }
       }
   }
}

Пример:

Скачать ZIP

SergeyGonchar
flash-developer
Visit Gonchar Website.

7 Responses to “Выполнение жадных алгоритмов без потери FPS. Chunker.as”

  1. Я конечно понимаю, что простота – есть залог чего-то там.. Но уж очень нехватает динамической коррекции таймер.делей от статистики времени исполнения, т.е. задержки между стартом тика и финишем. Там нет ничего сложного.
    Вообще, умные легивые вычисления – это прекрасно и это рекомендую использавать с умом, но часто.

  2. Flastar says:

    В данном случае лучше получать данный интервал с помощью PerfomanceTest. Т.е. мы определяем сколько по времени будет выполнятся наша функция с помощью PerfomanceTest и передаем Chunker параметр time

  3. Regul says:

    Крутая вещь! Делал подобное на php.

  4. Даниил says:

    Чем это лучше сетИнтервала?
    На самом деле оч интересныи для меня вопрос, поэтому был бы рад улышать что то просвещенное, так как сеичас юзаю бокс два ди и волд констракшн кит, что само по себе удобно (не нужно геимдизаинеру обьяснять многих вещеи сам сидит добавляет компоненты), но начал дописывать что то на чистом бокс два ди, что требует апдеита по интерфреиму или сетинтвала, и тогда ужос, весь гамм умирает по фпс.
    🙁

  5. Flastar says:

    setInterval использует Timer внутри

  6. focus says:

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

  7. hitab says:

    При вызове контекстного меню и небольшой задержки, у меня почти виснет браузер)))

Leave a Reply

×
%d bloggers like this: