Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   И снова: A script in this movie is causing Adobe Flash Player 9 to run slowly (http://www.flasher.ru/forum/showthread.php?t=101482)

FlintSan 19.09.2007 15:16

И снова: A script in this movie is causing Adobe Flash Player 9 to run slowly
 
Ошибка проявляется не на всех компах. Проект уже надо сдавать, а тут такая неприятность вскрылась (

Загружаю данные в массив из БД через XML.
С загрузкой никаких трабл. Затем вызывается функция в которой есть вот такой блок сравнения массивов
Код:

    for(var i:Number = 0; i <= (glb_masObject.length-1) ; i++) //проход по новому массиву объектов
        {
                glb_masObject[i].RepeatAnimation = true; //по умолчанию требуется анимация движения
                for(var j:Number = 0; j <= (glb_masPrevObject.length-1); j++) //проход по предыдущему(старому) массиву объектов
                {
                        if (glb_masObject[i].IdTransport    == glb_masPrevObject[j].IdTransport    &&
                            glb_masObject[i].TimeTrackSource == glb_masPrevObject[j].TimeTrackSource &&
                                glb_masObject[i].TimeTrackDest  == glb_masPrevObject[j].TimeTrackDest)
            { trace(i);
                                glb_masObject[i].RepeatAnimation = false; //не требуется анимация
                                break;
                        }
                }
        }

Player дает ошибку именно в этом блоке. Но не всегда! Только когда кол-во значений в обоих массивах превышает чуть больше 1000-1500.

То есть если в массиве glb_masObject 1800, из цикла
Код:

trace(i);
на значение 1328 вылет сообщения.

Пытался бороться через setInterval, но не устраивает его работа, даже если беру не по одному значению, а порциями по 100-300 значений,то жутко все тормозит и прорисовка уже отточенных элементов не дает желаемых результатов.

Есть ли способ побороть это "малой кровью" ? Есть ли какой-то способ заставить Player пройти до конца цикла, не останавливая его работу? Повторюсь все работает прекрасно, когда данных по индексу в массиве менее 500значений.

PS: Флеш в одном кадре, тысяча строк кода, swf 155Kb, 800*600.

etc 19.09.2007 15:40

Скорее всего glb_masPrevObject иногда оказывается неопределенным и весь вложенный цикл становится бесконечным. Или внешний, не суть.
Ошибка в парсинге, совершенно точно.

з.Ы. Ужасный код.

FlintSan 19.09.2007 16:10

Цитата:

Сообщение от __etc
Скорее всего glb_masPrevObject иногда оказывается неопределенным и весь вложенный цикл становится бесконечным. Или внешний, не суть.

1) Версия о том, что массивы могут быть неопрделенными отметается, вот полный код функции
Код:

function compareArray() { //Сравнение старых и новых подкаченных данных и определение тех миксеровозов
                          //для которых не требуется повторной анимации движения
 if (glb_debug == true) trace( "Beg compareArray()" );                                                 
 
 if (glb_masPrevObject != undefined && glb_masObject != undefined)
 {
        //Объект в одно время, может находится только в одной точке
    for(var i:Number = 0; i <= (glb_masObject.length-1) ; i++)
        {
                glb_masObject[i].RepeatAnimation = true;
                for(var j:Number = 0; j <= (glb_masPrevObject.length-1); j++)
                {
                        if (glb_masObject[i].IdTransport    == glb_masPrevObject[j].IdTransport    &&
                            glb_masObject[i].TimeTrackSource == glb_masPrevObject[j].TimeTrackSource &&
                                glb_masObject[i].TimeTrackDest  == glb_masPrevObject[j].TimeTrackDest)
            { 
                                glb_masObject[i].RepeatAnimation = false; //не требуется анимация
                                break;
                        }
                }
        }
 }
 if (glb_debug == true) trace( "End compareArray()" );                                                 
}

Цитата:

Сообщение от __etc
Ошибка в парсинге, совершенно точно.

Думаю вы не правы, была бы ошибка не было вообще никакой анимации на текущей мнемосхеме
Вот парсер, убрал только код по созданию объектов и событий к ним
Код:

var mixers_lv:LoadVars = new LoadVars();
mixers_lv.onData = function(srs:String) { //Загрузка инф-ции из БД, о прохождении миксера через считыватели, через XML файл
 var isFound:Boolean;
    if (glb_debug == true) trace( "Beg mixers_lv.onData" );

  //иницилизация глобальных переменных       
  glb_flagLoaded = false;
  glb_masObject = null;
  glb_masObject = new Array();
 
  glb_oldText = ""
  glb_NameMC = null;
  glb_NameMC = new Array;
 
  if (srs != undefined)
    {
        var rootXML:XML = new XML();
        rootXML.parseXML(unescape(srs)); 

                      for (var i = 0; i < rootXML.firstChild.childNodes.length; i++)
                                {
                                        var TrackingXML = rootXML.firstChild.childNodes[i];

                                        var points = new Array();
                                        for (var j = 0; j < TrackingXML.childNodes.length; j++)
                                        {                                               
                                                points.push( {NamePoint: TrackingXML.childNodes[j].attributes.NamePoint,
                                                                          orderMove: TrackingXML.childNodes[j].attributes.orderMove,
                                                                          X: _level0[TrackingXML.childNodes[j].attributes.NamePoint]._x,
                                                                          Y: _level0[TrackingXML.childNodes[j].attributes.NamePoint]._y
                                                                        }
                                                                    )
                                        }
                                        glb_masObject.push( {
                                                                  nRec: i,
                                                                  RepeatAnimation: true,
                                                                  IdTransport: TrackingXML.attributes.IdTransport,
                                                                  TimeTrackSource: TrackingXML.attributes.TimeTrackSource,
                                                                  IdSource: TrackingXML.attributes.IdSource,
                                                                  TimeTrackDest: TrackingXML.attributes.TimeTrackDest,
                                                                  IdDest: TrackingXML.attributes.IdDest,
                                                                  car: TrackingXML.attributes.car,
                                                                  points: points
                                                                  }
                                                                )
                                        ...........................
                                        ...........................
                  dataGridHistory.dataProvider = glb_masObject;                               
                //Сравнение старых и новых подкаченных данных и определение тех миксеровозов для которых не требуется повторной анимации движения
                compareArray();
               
                glb_n = 0;
                glb_flagLoaded = true;
        return true;
    }
        else
        {
    clearInterval(intervalId); //Сброс таймера перемещения миксеровозов
        intervalId = null;               
        if (glb_debug == true)
        {
          trace("Нет данных о перемещениях миксеровозов!");
          lstDebug.addItem("Нет данных о перемещениях миксеровозов!");
        }
        return false;
        }
    if (glb_debug == true) trace( "End mixers_lv.onData" );
}

В загрузчике, timestamp всегда генерится разный и IE не использует кэш.
XML файл приходит полным
Код:

mixers_lv.load(http_root+"m.ashx?db='"+glb_str_db+"'&de='"+glb_str_de+"'&timestamp=" + DateUTCInSQLStr(timestamp) );

Цитата:

Сообщение от __etc
з.Ы. Ужасный код.

А конкретней?


Часовой пояс GMT +4, время: 23:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.