![]() |
|
||||||||||
|
|||||
|
Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
|
Часть 3
Уважаемый All, я надеюсь, что предлагаемый материал поможет КАЖДОМУ (т.е. не иолько новичкам) лучше ПОНИМАТЬ Flash и других флешеров. Особенно если у него сложилось впечатление, что Flash это совсем просто. Я предполагаю что читатель хотя бы вскользь просматривал первые две части данного материала и имеет представление о том о чем может пойти речь, об очередных граблях, конкретно о коварстве LoadVariable и не только. Эта часть появилась почти случайно (в плане были совсем другие грабли но они еще не совсем созрели) и я захотел проиллюстрировать первую часть (Грабли 1) примером с загрузкой переменных, которые то загружаются то не загружаются. Тем более что этот вопрос один из наиболее часто встречающихся в форумах. Пример для тех кто внимательно читал первую часть совершенно очевидный: - делаем сцену с двумя слоями Actions и Text и двумя фреймами - делаем мувик(MyMovieText) в нем сивол с динамическим текстом (myText), - помещаем его в первый кадр слоя Text - добавляем в ObjectActions код onClipEvent(data) { this.myText = this.dataLoad } - в первый фрейм слоя Actions пишем loadVariables("data.txt","myMovieText") - во второй фрейм слоя Actions пишем stop() - делаем файл данных (data.txt) со следующим содержимым: dataLoad=blablalblablablablalbla и все пример готов - запускаешь и наслаждаешься созерцанием blablalblablablablalbla чуть-чуть правишь ObjectActions и наслаждаешься пустым экраном. Нюанс был в том каким образом создавался второй фрейм в слое Text если через InsertFrame, то все хорошо, а вот если через InsertKeyFrame то вот они грабли - ждут не дождутся.... Пример был уже давно заготовлен, надо было только загрузить Flash и скопировать скрипты и логи. Загружаю, запускаю и ... желаемого эффекта не получаю - грузятся переменные, заразы такие, как бы я не корежил первый фрейм. А первая часть уже выложена в Инете - отступать некуда, или я прав или где... Самое интересное я действительно не трогал эту флэшку две недели в принципе, а то что она работала\не работала я вроде помню абсолютно точна, да и не должна она грузить переменные если я хоть что-то понимаю в граблях. Полтергейст какой-то макромедийный. Желающие могут попробовать и будет интересно сравнить их результаты: у одних получится, а у других нет. Причем те у кого тачки по-навороченнее скорее всего на грабли наступят (так им и надо), а те кто по-проще проскочат и даже не заметят... Догадываетесь в чем дело. Правильно, за две недели мою машинку осчастливили очередным, ну очень нужным, сервисом и она стала чуть-чуть, ну самую малость по-задумчивей, или просто в момент тестирования состав и количество работающих приложений было другое. Ну что заинтересовал - тогда приступим к разбору полетов. Постараюсь по-короче, хотя я сам на это дело угрохал полдня. Итак делаю тестовый мувик. - делаю файл данных (data.txt) со следующим содержимым: dataLoad=blablalblablablablalbla - делаю сцену с двумя слоями Actions и Text и двумя фреймами - делаю мувик(MyMovieText) в нем сивол с динамическим текстом (myText), - помещаю его в первый кадр слоя Text - добавляю в ObjectActions код onClipEvent(data) { _level0.myTrace("LoadDat:") this.myText = this.dataLoad } onClipEvent(load) { _level0.myTrace("LoadMCl:") } onClipEvent(enterFrame) { _level0.myTrace("EnterFr:") } - в первый фрейм слоя Actions пишу myTrace = function (tData) { var tString = "frame: " + _root._currentFrame + " " + tData + " " + getTimer() if (_level0.myMovieText.dataLoad == null) { trace(tString + " dataLoad: null")} else { trace(tString + " dataLoad: " +_level0.myMovieText.dataLoad)} } myTrace("Start: ") //loadVariables("data.txt","myMovieText") loadVariables("http://pc29:81/data.txt","myMovieText") myTrace("AfterLV:" ) - во второй фрейм слоя Actions пишем myTrace("Stop: ") stop() - делаю второй фрейм в слое Text сознательно нарушая собственные рекомендации используя InserKeyFrame. И все работает. Пока код в ObjectActions не изменяется разницы использовали мы InserKeyFrame или InserFrame практически нет, только по разному отображается на таймлайне. Но вот мы изменяем код в первом фрейме добавив в обработчик события load - i=0, а в обработчик события enterFrame - i++ . Это приводит к тому что мы фактически имеем два внешне одинаковых мувика, с одним и тем же названием, Но на самом деле разных - см. Грабли 1. Мы грузим данные в первый мувик, который затем сменяется вторым, внешне похожим, но с другим набором внутренних значений. Данные по идее не должны отображаться, но иногда они вроде как нормально грузятся, а иногда нет. Чтобы разобраться с этим я изменил Frame Rate мувика (Modify>Movie) почти на максимальное - 100 кадров всекунду, изменил код в ОbjectActions следующим образом onClipEvent(data) { _level0.myTrace("LoadDat:") this.myText = this.dataLoad } onClipEvent(load) { _level0.myTrace("LoadMCl:") _root.stop() i = 0 pauseFrames = 1 } onClipEvent(enterFrame) { _level0.myTrace("EnterFr:") i++ if (i > pauseFrames) { _root.play()} } Кроме того я разместил файл данных пусть и не наочень удаленном, но сильно загруженном сервере. Суть всех этих приготовлений затормозить процесс загрузки данных так чтобы его можно было бы рассмотреть по шагам. Варьируя параметр pauseFrames можно добиться того чтобы данные грузились как в первый фрейм, так и во второй, но что самое интересное можно добиться того чтобы они грузились вообще неивестно куда, т.е. получить ситуацию когда данные гарантированно пропадают. Вот три распечатки при значении параметра pauseFrames равным 1, 2. 3 pauseFrames = 1 : frame: 1 Start: 33 dataLoad: null frame: 1 AfterLV: 33 dataLoad: null frame: 1 LoadMCl: 33 dataLoad: null frame: 1 EnterFr: 70 dataLoad: null frame: 1 EnterFr: 95 dataLoad: null frame: 2 Stop: 111 dataLoad: null frame: 2 LoadMCl: 111 dataLoad: null frame: 2 LoadDat: 120 dataLoad: blablalblablablablalbla frame: 2 EnterFr: 121 dataLoad: blablalblablablablalbla frame: 2 EnterFr: 130 dataLoad: blablalblablablablalbla ....................... pauseFrames = 2 : frame: 1 Start: 33 dataLoad: null frame: 1 AfterLV: 34 dataLoad: null frame: 1 LoadMCl: 34 dataLoad: null frame: 1 EnterFr: 69 dataLoad: null frame: 1 EnterFr: 94 dataLoad: null frame: 1 EnterFr: 107 dataLoad: null frame: 2 Stop: 118 dataLoad: null frame: 2 LoadMCl: 118 dataLoad: null frame: 2 EnterFr: 129 dataLoad: null frame: 2 EnterFr: 149 dataLoad: null frame: 2 EnterFr: 179 dataLoad: null ............................. pauseFrames = 3 : frame: 1 Start: 33 dataLoad: null frame: 1 AfterLV: 34 dataLoad: null frame: 1 LoadMCl: 34 dataLoad: null frame: 1 EnterFr: 69 dataLoad: null frame: 1 EnterFr: 95 dataLoad: null frame: 1 EnterFr: 113 dataLoad: null frame: 1 LoadDat: 123 dataLoad: blablalblablablablalbla frame: 1 EnterFr: 123 dataLoad: blablalblablablablalbla frame: 2 Stop: 146 dataLoad: null frame: 2 LoadMCl: 146 dataLoad: null frame: 2 EnterFr: 156 dataLoad: null frame: 2 EnterFr: 166 dataLoad: null .................................... Хочу отметить, что даже для таких лабораторных условий результаты не всегда стабильны - зависит от загрузки машины и сервера на момент исполнения теста. Но приведенные логи позволяют понять что собственно происходит при использовании LoadVariables. Прежде всего эта команда не прямого действия - он только запускает какой-то процесс, который после завершения считывания данных из сети загружает их в мувик извещая об этом событием data. И похоже LoadVariables использует для загрузки данных имя мувика, а не ссылку на конкретный мувик. следовательно если есть мувик с таким именем на момент приема данных то данные загружаются. Вся тонкость заключается в том что событие data вызывается только после события load. Т.е. если мувик не загружен, то и данные в него не загрузятся. Так как время загрузки мувика величина далеко не постоянная и зависит от множества параметров, то это является причиной того что исходный пример то работал, то не работал. Успеет загрузиться то данные ему передаеются, не успел - значит сам виноват. Еще раз напомню, что такая ситуация возникает только потому, что за счет операции InsertKeyFrame и изменения кода в ObjectActions фактически имеем два различных мувика, но с одним названием и предполагая что грузим данные в один мувик мы на самом деле пытаемся загрузить их в другой, т.к. реально ситуация аналогичная логу с pauseFrames = 3 никогда не возникает. И здесь уж как повезет. Зависит и производительности машины, и скорости канала и обьема передаваемых данных. Так что рекомендации из "Граблей-1" в данном случае вполне справедливы. Возможно в ваших приложениях все прекрасно и все грузиться как надо и куда надо. А может быть и нет - угадайте когда вы это почувствуете. Хотелось бы отметить еще один момент - по документации разница между LoadVariables и LoadVariablesNum практически незаметна - один грузит данные в мувик, другой - в левел, и то и другое вобщем-то мувик так что разница не принципиальная, кроме того где надо искать загруженные переменные. А разница на самом деле существенная - левел имеет неограниченный период жизни и практически не перегружается следовательно данные всегда в него попадут и никуда не исчезнут. А вот время жизни мувика не всегда бесконечно и хотя на экране что-то очень похожее на него может присутствовать постоянно, данные в него могут и не попасть или не сохранится при его перезагрузке. Вот собственно и все - как этим материалов воспользоваться, решать вам самим, "Кто предупрежден - тот вооружен", но если позволите я попробую сформулировать некоторые размышления по этому поводу. P.S. Все замечания к данному тексту прошу дублировать на apm@tut.by Best regards, APM |
|
|||||
|
Реально очеь много глюков во Флэшке! Вот у меня недавно trace перестал работать. Не трейсит и все тут! Открываешь новый мувик, копируешь фреймы старого, запускаешь - все пашет! И вроде ничего ведь не изменил!
--- Я тебе скаже, гораздо хуже, что всякие такие глюки есть в СИ++. Тоже - стер строку, написал заново - и работает. А вот если пара десятков тыщ кода, найти глюку не так то просто ![]()
__________________
suum quique |
|
|||||
|
Да... мне кажется в Flash6 "граблей" будет не меньше.
APM, а можно "Анонс на Грабли" |
|
|||||
|
Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
|
RE: MegaBug
Что значит "Анонс на Грабли" - не очень понял. Был в отпуске и еще не вошел в форму. Если о планах на будущее, то в плане еще три части - об особенностях программирования во флэш с философской точки зрения, об особенностях взимодействия различных событий, и некоторые странности с некоторыми переменными. Может быть будет и еще что-то, но это как пойдет масть - мало на грабли наткнуться, надо еще и сообразить как с этим быть. А вообще-то мне хотелось бы попробовать показать как можно пользоваться граблями - некоторые вещи при этом можно сделать так, что только ахнешь. |
![]() |
Часовой пояс GMT +4, время: 04:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|