PDA

Просмотр полной версии : getBytesTotal()?


Nob
20.07.2002, 01:57
Всем привет!

В продолжение разговора(?)о внешних загружаемых мувах.
Скажем, на кнопку подвшена загрузка мува в клип-контейнер на level0: _root.mh

on(release) {
loadMovie("my.swf","_root.mh");
...
//define file size
with (_root.mh) {
total=getBytesTotal();
}
}

Однако вызов getBytesTotal() как в скрипте подвешенном на кнопку (см. выше), так и в обработчике контейнера _root.mh, куда фильма грузится, показывает не реальный размер, а какое-то малое число, например 12. Связано ли это с тем, что реально в момент вызова загрузка еще не началась? Если дело в этом, то как отловить факт начала загрузки?
Сразу оговорюсь, что
1. ресурс качается с сервера;
2. в основной сцене все лежит в одном кадре (так нужно - просто все написано на AS в стиле системы с диспетчеризацией событий и с-ма крутится в цикле в 1 кадре).
Знакомая проблема?

NeX
20.07.2002, 02:42
А ты у чего, собственно говоря, измеряешь getBytesTotal()?.. У кнопки?..

Nob
20.07.2002, 03:02
Да, нет же, конечно не у кнопки, а у клипа-контейнера -root.mh, куда мой внешний мув грузится (см. код в первом письме). Однако, почитал я найденное в поиске и ... ясно, что та еще функция getBytesTotal. Кстати, может проблема в том, что swf, который я гружу всего из 1 кадра
(просто растр). Сейчас проверю что-нибудь еще.

NeX
20.07.2002, 03:11
Упс... да, это я как всегда невнимательно смотрю... а вообще в 1 строчке with использовать не в тему... А чтобы легче тебе было помогать, дай исходник, там и посмотрим...

Nob
20.07.2002, 04:02
Спасибо за участие.
Вот собственно фрагмент кода-болванки (пришлось слепить на ходу выдрав из системы) - фактически просто комбинация клипа-контейнера и прелоадера с тестовыми полями. Похоже, что все замечательно работает, я имею ввиду getBytesTotal, когда вызов стоит в самом муве (см. многочисленные исходники прелоадеров на форуме).
Что до with, то тут просто дельфийско-паскалевская привычка экономного письма.

NeX
20.07.2002, 04:55
Ну ты и написал.... У меня аж перегрев случился... ;)

На самом деле, че тебе надо то?.. Я сначала думал, что понимаю, а когда пример посмотрел, то стал сомневаться...

Я понял так - при нажатии на кнопку тебе надо начать грузить мув в мув и при этом выводить статистику по загрузке, так?..

NeX
20.07.2002, 05:16
Все, короче, просек я твою фишку... Блин, голова совсем под вечер не варит... Еще на диско идти... Кошмар...

Ладно, к делу:

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

Посему, решение такое - стирай все, что ты там написал :p , и _root.mh.getBytesTotal(); пихай на _root.onEnterFrame в первый кадр (собственно, единственный)... туда же пихай всякие там процентов рассчет и т.п. Так все работает...

Кстати, ты че мне сказал, что мув - это растр... я с трудом услышал это пищани... Только благодаря тому, что бук у меня на коленях... Так сказать, внутренним ухом уловил... ;)

Если не работает (хотя этого не может быть), или че-то не подходит, дай знать...

Nox Noctis
20.07.2002, 15:35
все правильно... на то, чтобы получить сведения о размере файла тоже нужно время...
но я не понимаю зачем тебе вообще засекать размер в самом начале... никто не мешает опрашивать getBytesTotal каждый кадр - это несколько избыточно, но затраты времени на эту операцию ничтожны...

зы: встретились как-то Nob, Nex и Nox :)))))

Nox Noctis
20.07.2002, 15:56
+ фишка еще в том, что гетБайтсЛоадед\Тотал можно опрашивать и у обычных клипов :) в которые ничего не грузится... поэтому если у тебя клип, в который ты грузишь не был пустым, то сначала и тотал и лоадед не будут равны нулю !.. :)

Nob
20.07.2002, 17:15
> Nex

Ты прав - в корне все работает, однако не менее прекрасно оно работает если повторять опрос постоянно, при этом неважно куда подвешен код - на контейнер, куда грузим, на индикатор или хотя бы прямо в корень (_root).

Конечно на опрос функции требуется время, однако
можно проверять результат, возвращаемый getByteTotal() (звучит абсурдно, но вот статистика опроса - -1; 0; реальный размер), см. код далее, подвешенный на контейнер:

onClipEvent (load) {
this.total=0;
this._NAN_total=-1;
_root.t=total;
}

onClipEvent (enterFrame) {
// Это, если лениво каждый раз опрашивать размер
if ((total <> NAN_total) || (total = 0)) {
NAN_total=total;
total=getBytesTotal();
_root.t="total is "+total
};
// Опрос в каждом frame'е
// total=getBytesTotal();
// _root.t="total is "+total

_loaded=getBytesLoaded();
this.pt=_loaded;
}

Фильма с растром была из 1 кадра, вот я и положил sound, что под руками было.

P.S. Это ты хорошо заметил, насчет внутреннего уха... ;)

> Nox Noctis

1. С фишкой все ясно - any clip все равно ведь грузился, вне зависимости, обрабатывал ты событие load или нет.

2. Опрашивать "каждый раз" можно и все конечно будет работать, но ...
2.1. Существует алгоритмическое программирование
2.2. Когда суммарный AS тянет на 40-50 Kb, слоев и клипов на сцене немерено и диспетчер все это шарит... вопрос вызова может стать критичным. Хотя, кто знает?
(Сейчас обвинят в sNobизме. Шутка.)

Так что, все работает в клипе и вне его. Спасибо ребята. Топику конец. Надеюсь, что не знакомству.
Закончу, кину link, если интересно.

Удачи всем!

Nox Noctis
20.07.2002, 18:50
алгоритмичность это конечно круто...

взяли простенький код:
s = getTimer();
for (i=0; i<1000; i++) {
img.getBytesTotal();
}
e = getTimer();
trace((e-s)/1000);
где img - это клип в котором лежит большая картинка... просто для примера...

результат на машине PIII - 733mhz:
1000 циклов - около 0.060 сек
2000 циклов - около 0.125 сек
3000 циклов - около 0.185 сек
4000 циклов - около 0.245 сек
5000 циклов - около 0.300 сек

это на таких больших числах :) а например 50 опросов занимают 1-2 (максимум 3) милисекунды...

...плюс ко всему если все правильно организовать, то опросы getBytesTotal будут происходить только с теми клипами которые в данный момент грузятся... и по окончании загрузки будут прекращаться...
...ни за что не поверю, что твой диспетчер будет грузить даже 100 файлов одновременно... ;)
а значит потеря на гетБайтсТотал в каждом кадре не будет превышать каких-то там микро секунд :) ну так чего мучаться - зачем злоупотреблять алгоритмичностью в ущерб практической простоте ? :)

Nob
20.07.2002, 20:42
> Nox

Пришел, увидел, убедил!

Thanks once more. :D

Nob
21.07.2002, 01:37
Вот уж думал, все - ан, нет. Все еще проще (надо было мне Help внимательнее читать):

onClipEvent (data) {
total=getBytesTotal();
...
}

Вот он, реальный total, который возвращает БиллГейтсТотал() при работе с LoadMovie, т.к. событие data возникает при приемке очередной порции "груза".

Теперь все...

:p :p :p

Nox Noctis
21.07.2002, 13:09
насчет того, что нужно было почитать хэлп - это очень разумная мысль :)))

onClipEvent (data) {...}
вызывается единожды по окончании загрузки файла...

так что это для прелоадера не сильно пригодится... ведь нужно отслеживать процесс, а не только его завершение...

Nob
21.07.2002, 19:16
> Nox Noctis
...
data The action is initiated when data is received in a loadVariables or loadMovie action.
When specified with a loadVariables action, the data event occurs only once, when the last variable is loaded.
When specified with a loadMovie action, the data event occurs repeatedly, as each section of data is retrieved.

That' all. :p
Просто с помощью load корректно «ловить» totalsize.

P.S. Поиск, конечно, «рулит». Но,... на форуме каждый 3-й вопрос - вариации предыдущего. Не пора ли автоматически преадресовывать запросы user'ов на соответствующий раздел FAQ или описать аналогичные прелести где-нибудь еще? Ведь БиллГейтсТотал() весьма безобидный «перл» и далеко не единственный. :)

Nox Noctis
21.07.2002, 22:13
так я и думал, что ты это скажешь ;))

не обязательно мне цитировать хэлп :) у меня такое серьезное подозрение, что я его читал значительно раньше и перечитывал значительно чаще :)))

так вот - в хелпе написана лажа :)
вобщем в этом ничего удивительного нет, но иногда озадачивает :)

onClipEvent(data) срабатывает по окончании загрузки.
не верится - возьми большой файл и проверь.
или просто почитай чего пишут на макромедии (http://www.macromedia.com/support/flash/ts/documents/onclipevent_data.htm)
тут на странице раз десять повторяют:
an event is created by Flash when the last item of that data has finished loading

that's all I had to say :)))

Nob
23.07.2002, 03:17
> :cool: Nox Noctis

Я полагал, что ты так ответишь :)
Наш диалог все больше напоминает фильм «Дуэлянты»,
осталось только выяснить кто Харви Кайтель, а кто Керредайн. ;)
Однако дело не в этом, а в принципе.
(In AS veritAS) || (truth is out there...) { :p }

"…Видела про тебя новый мультик вышел? Нет? Ну, ты даешь! Давай качать!
Ну, лажа, как всегда, но прикольно… Давай, врубай… будем качать"
"… Ну и где тут эта хрень очередная? "
"Сюда (http://www11.brinkster.com/solo2/portfolio_m.html) вот кликай. Все… па-ашло качаться…."

Press "вишенку" "file" и подожди немного. Обрати внимание на строчку call number, особенно на тот момент, когда там появится "1", а также что там будет, когда загрузится %50 от total size. Дождись 100%, включи звук и наслаждайся…
(А ведь в Help'е, где "лажа", все правильно написано - событие генерится по мере поступления данных, т.е. по частям). Вот source, ежели интересно. Кстати, прикольные результаты для числа вызовов обработчика на событие Data при загрузке файла возникают даже после того, как он (файл, прим. авт.) пропишется в cache.
Что же до загрузки переменных - то здесь все правы - и ты и Help и Macromedия (please, press кнопочку "vars"). И еще о Макромедии - на той страничке речь идет о загрузке переменных, это раз, к тому же Help и technical support одни люди делают.

That's I should reply.

P.S. Картинки (swf) с неплохого сайта (местами напоминает Гринуэя, «Интимный дневник»)
Now -I- decided... (http://www.now-i-decided-to-speak-with-the-silence.com/index2.html)

P.P.S. По поводу "more often" & "earlier".
Статистика посещений форума и частота обращений к Help'у, суть величины некоррелированные.
Не говоря уже о рекурсиях... ;) ;)
In any case спасибо за совет и ссылки.
Я понял, You are cool. :cool:
Удачи!

Nob
23.07.2002, 03:21
Pardon moi!
Source attached further.

:)

NeX
23.07.2002, 04:32
АА...... я выходит тоже плохо хелп читаю..... Внатуре ведь...

Однако, все таки, я - за свой вариант, поддержаннннный Noх'ом, ;) т.е. вставлять на входе кажжждого кадра.... На самом деле будет точнее....

Nox Noctis
23.07.2002, 18:11
разговр с тишиной - красивая штука... просто здорово...


с loadVariables и loadMovie промашка вышла, признаю :)
я-то все время говорил про переменные...

сорец у тебя нерабочий :p прелоад не работает совсем :)
(а свфник совсем не грузится...)

зы: между этими величинами корелляция может и отсутствует... зато присутствует связь с количеством оставшегося в оперативной памяти ;)

NeX
24.07.2002, 11:16
Ну как сказать, скажем, работает частично.... 2 главных функции, собственно говоря, выполняет....


Да ладно, у всех бывает.... ;)

Ну а тишина - тишина это замечательно .... :p

Nox Noctis
24.07.2002, 12:54
да я не наезжаю :) просто придираюсь слегка :)

NeX
24.07.2002, 12:56
Так я ниче и не говорууууууу........ ;)

Nob
24.07.2002, 12:58
Привет! :)

> Nox

Это source той части, что лежит на сервере. Если ты следовал "инструкциям" и наблюдал картинки - стало быть оттуда все работало.
Извини, что опять цитирую help: The URL must be in the same subdomain as the URL where the movie currently resides. For use in the Flash Player or for testing in test-movie mode in the Flash authoring environment, all SWF files must be stored in the same folder, and the file names cannot include folder or disk drive specifications.
Видимо потому из среды ничего и не грузится (загружаемый swf и основной мув должны жить вместе или это не так?), либо я что-то не "въезжаю". Поправьте "ищущего совета", если я не прав. А "сырец" я положил для пояснения откуда поле "call number" берется.

P.S. Кстати, спасибо за урок по MX - очень своевременно. (Где-то год назад занимался частичной эмуляцией этого "менизЬма" через модификацию прототипа movieclip)

> Nex

Я рад, что тебе понравилось. Только ... о какой тишине идет речь ("... Silence", тишина, как дар ПРИРОДЫ, отсутствии звука в муве или реплик со стороны "Nob'a")? ;) ;)

NeX
24.07.2002, 13:06
Ребят, а я разве чо говору?.. ;)

Это я так, сам с собой.... уже во сне.... :p

Nox Noctis
24.07.2002, 13:24
2Nob
насчет субдомена -
такое ограничение есть для всех загружающих функций...
(об этом написано здесь (http://www.macromedia.com/support/flash/ts/documents/loadvars_security.htm))
...если свф запущен в броузере. в противном случае все должно работать и так :)

Nob
24.07.2002, 13:42
> Nox

Слушай, я наверное тебя уже "достал" :rolleyes: - с ограничением все ясно, дело в неверно прописанных путях или еще в чем-то?
(Я имею ввиду доступ к внешнему ресурсу из standalone state)

Nox Noctis
24.07.2002, 13:47
да не :) меня достать не так просто :)

не знаю в чем дело... у меня твой свфник из примера не грузится даже в броузер - не то что в тестовый свф :)

Nob
24.07.2002, 14:32
> Nox

Да, вероятно сегодня не мой день, но пользуясь случаем, раз уж "не так легко...". Вопрос наверное идиотский, но я уже сомневаюсь, можно ли в locale получить доступ к внешнему ресурсу в сети в принципе? Не могу ничего загрузить со своего сервера. Путь прописываю абсолютный типа: "http://www11.brinkster.com/solo2/portfolio_m/data.txt"
??? :(
Больше надоедать не буду.
;)

Nox Noctis
24.07.2002, 14:56
хмм... чудеса на виражах...
такого я пока не встречал :)

а относительный путь тоже не работает ?.. тогда не знаю... нет идей... :confused:
может ты что-то перехитрил с правами доступа ка файлам на сервере...