Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Advanced (http://www.flasher.ru/forum/forumdisplay.php?f=4)
-   -   Как загрузить большой массив данных во Flash быстрее чем клоном split? (http://www.flasher.ru/forum/showthread.php?t=20138)

trY 19.09.2001 04:04

to APM
 
to APM :) :)

Мне понравилось :) :) :) :), пошел думать :) :).
А можно дать наводку ( ссылки, откуда начать искать.. и т.д.) на информацию о механизме включения и выполнения ActionScript во Флеше - то самое "hardcoded" i interpreteded :) :) ? - это очень интересно :) (со структурой свф-а чуть-чуть знаком.. :)


to DMCom
Тесты с XML чуть позже выложу, вроде я там в самом деле лажанулся :) , что правда , не отменяет замерзания с ним.. :)

DMCom 19.09.2001 11:49

Re:
 
Привет, ну вы блин даёте, вот что я думаю:
Первое:
Try - я тут подумал и понял, что мы с тобой говорим о разных вещах:: Вот как бы я сделал вместо той петрушки которую ты заварил :cool:
У тебя есть массив MyArray[10000] ... структур
{
a : Int;
b: Int;
c: String;
}

На серваке делаешь <node><a>1</a><b>20</b><c>MyString</c></node>
<node><a>2</a><b>20</b><c>MyString</c></node>
..............500000 раз..............
<node><a>500000</a><b>20</b><c>MyString</c></node>
Грузишь в MyXMLObject = new XML();
делаешь
MyXMLArray = MyXMLObject.childNodes;

теперь
MyXMLArray[1] = "<node><a>1</a><b>20</b><c></c>MyString</node>";
MyXMLArray[2] = "<node><a>2</a><b>20</b><c></c>MyString</node>";
и так далее.. Понимаешь о чем я?
Затем тебе надо получить значение для "a" в 1000 позиции,

A = GetAValue(1000);

function GetAValue(Index) {
return MyXMLArray[Index].firstChild.firstChild.nodeValue;
}
function getBValue (Index) {
..................
}
function GetStringValue(Index) {
.................
}
ни чего не тормозит не залипает и не глючит .................

:cool:
Именно для таких целей и добавлен объект XML, а не просто для
тупой пересылке данных и затем сливания их в какой нибуть
простой массив........
:rolleyes:

DMCom 19.09.2001 12:05

Re:
 
Второе: А по поводу того если нужно всё-же зачитать в массив,
то нужно организовать трех кадровый цикл в каком нибуть муве,
1 Frame; Инитим каунтер .
2 Frame: Тело цикла;
3 Frame: Необходимые итерации, проверки .... и переход на Frame 1;

Вот такая вот загогулина получается......... :))
:p
Если что не так, то вот моя аська 121790661....

APM 19.09.2001 20:40

To DMCom
Спасибо DMCom – ты безусловно прав. XML object во Flash5 реализован просто замечательно, только сейчас у меня дошли руки с ним разобраться. (Первоначальное знакомство с его описанием в документации как-то не вдохновило). Зато какое удовольствие я получил сейчас после длительного общения со всякими SAX и DOM парсерами, как не хватает в Sunовских пакетах чего-то похожевого – простого, удобного и удивительно быстрого. Еще раз спасибо - теперь и я буду
регулярно хоронить LoadVariables. А если Macromedia также реализует SVG object – наступит благодать неописуемая…

To trY
Предлагаю тебе попробовать вот этот фрагмент кода – надеюсь результат тебе понравиться. (Данные (xmldata.xxx) подготовь как советовал DMCom) Я во всяком случае для себя определенные выводы сделал. Можем переходить к следующим проблемам.

on ( release ) {
//mcSplit.loadVariables( "load1.txt", "POST" );
function getAValue(index)
{ //trace(_root.MyXMLArray[index].firstChild) //try it for better understanding XML object
return _root.MyXMLArray[index].firstChild.firstChild.nodeValue

}
function getBValue(index)
{ //trace(_root.MyXMLArray[index].childNodes) //try it for better understanding XML object
return _root.MyXMLArray[index].childNodes[1].firstChild.nodeValue
}
function getCValue(index)
{ //trace(_root.MyXMLArray[index].childNodes[2].firstChild) //try it for understanding XML object
return _root.MyXMLArray[index].childNodes[2].firstChild.nodeValue
}
MyXMLObject = new XML()
MyXMLObject.onLoad = function (success)
{ if (success)
{ var iTimer = getTimer()
_root.MyXMLArray = this.childNodes
var timeSplit = (getTimer() - iTimer) / 1000
var allTime = (getTimer() - startTime) / 1000
iTimer = getTimer()
txResult = "last record:"
+ "\na = " + getAValue(_root.MyXMLArray.length - 1)
+ "\nb = " + getBValue(_root.MyXMLArray.length - 1)
+ "\nc = " + getCValue(_root.MyXMLArray.length - 1)
var readTime = (getTimer() - iTimer) / 1000

_root.txSplit = "xml load " + _root.MyXMLArray.length + " xml records"
+ "\nsplit time: " + timeSplit
+ "\nall time: " + allTime
+ "\n" + txResult
+ "\nread time: " + readTime
//trace(MyXMLArray) //try it for better understanding XML object
}
else
{ _root.txSplit = "ERROR!"
}
}
startTime = getTimer()
MyXMLObject.load("xmldata.xxx")

}
P.S.
Выполнение задачи кусками все-таки советую взять на заметку - при серьезной обработке текста (и не только) очень часто приходится сталкиваться с "тормозами". А во Flash такое “выполнения по частям” очень удобно делать.
P.P.S.
Я бы не советовал искать "ключики" к hardcoded функциям (фактически ассемблерные вставки в плейер)– во первых это нарушает модель защиты Flash, а во вторых – ненадежно – может измениться в новой версии плейера. И вообще мне бы не хотелось услышать о флеш-вирусах и так заказчики пошли перепуганные. Так что "ключики" эти если и есть, то должны быть хорошо спрятаны, а если бы их прятал я - так еще бы и пару сюрпризов приготовил для "шаловливых ручек".

trY 20.09.2001 12:22

Вложений: 1
Всем большое спасибо, :) :), пошел думать

Выкладываю тест с XML данными.

Результат теста: происходит "замораживание" при создании Флешем XML-a - т.е. между командой Load и вызовом функции onLoad ( Правда, времена поменьше будут:)

1) 100 нодов, в ноде 4 атрибута - 0.450 секунды
2) 200 нодов, в ноде 4 атрибута - 0.80 секунды
3) 400 нодов, в ноде 4 атрибута - 1.60 секунды

Тест прикладываю :)

Думать пошел :)

john 21.09.2001 15:58

Можно ускорить парсинг ХМЛ во флэш если убить пробелы и переносы, так как флэш понимает их как текстовые ноды и создает элементы, на что естественно тратятся ресурсы.

Ниже сравнение между файлами с пробелами и после их удаления на моей машине.


Тестирование без редактирования файлов.

Start loading; 100 nodes ; Loaded by onLoad function; Delta Time = 445
Start loading; 200 nodes ; Loaded by onLoad function; Delta Time = 768
Start loading; 400 nodes ; Loaded by onLoad function; Delta Time = 1454

После удаления проблелов и переносов:

Start loading; 100 nodes ; Loaded by onLoad function; Delta Time = 273
Start loading; 200 nodes ; Loaded by onLoad function; Delta Time = 451
Start loading; 400 nodes ; Loaded by onLoad function; Delta Time = 848

john 21.09.2001 16:05

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

http://www.layer51.com/proto

утверждалось что работает раз в десять быстрее, или даже больше.

И Дениска на форуме (нужно поискать) давал наводку переделываня парсинга чере ASNative (что не рекомендуется потому что наличие этой функции в шестерке под вопросом)

Я не переделываю парсинг, потому что у меня соообщения не в основном одно-нодовые, ну иногда бывает до пяти.

APM 21.09.2001 18:51

Thanks John
http://www.flasher.ru/forum/showthre...light=ASNative


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

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