Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.09.2007, 15:16
FlintSan вне форума Посмотреть профиль Отправить личное сообщение для FlintSan Найти все сообщения от FlintSan
  № 1  
Ответить с цитированием
FlintSan

Регистрация: Sep 2007
Сообщений: 3
Thumbs down И снова: 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.

Старый 19.09.2007, 15:40
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

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

Старый 19.09.2007, 16:10
FlintSan вне форума Посмотреть профиль Отправить личное сообщение для FlintSan Найти все сообщения от FlintSan
  № 3  
Ответить с цитированием
FlintSan

Регистрация: Sep 2007
Сообщений: 3
Цитата:
Сообщение от __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, время: 12:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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