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

Вернуться   Форум Flasher.ru > Архив Flasher.ru > Flash > ActionScript

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

Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
Attention Ахтунг - Грабли 3

Часть 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

Старый 23.10.2001, 00:30
RFMitrio вне форума Посмотреть профиль Отправить личное сообщение для RFMitrio Посетить домашнюю страницу RFMitrio Найти все сообщения от RFMitrio
  № 2  
RFMitrio
 
Аватар для RFMitrio

Регистрация: Aug 2001
Адрес: город на Неве
Сообщений: 1,908
Отправить сообщение для RFMitrio с помощью ICQ
Реально очеь много глюков во Флэшке! Вот у меня недавно trace перестал работать. Не трейсит и все тут! Открываешь новый мувик, копируешь фреймы старого, запускаешь - все пашет! И вроде ничего ведь не изменил!
---
Я тебе скаже, гораздо хуже, что всякие такие глюки есть в СИ++. Тоже - стер строку, написал заново - и работает. А вот если пара десятков тыщ кода, найти глюку не так то просто
__________________
suum quique

Старый 23.10.2001, 14:30
MegaBug вне форума Посмотреть профиль Отправить личное сообщение для MegaBug Посетить домашнюю страницу MegaBug Найти все сообщения от MegaBug
  № 3  
MegaBug
 
Аватар для MegaBug

Регистрация: Jan 2001
Сообщений: 125
Отправить сообщение для MegaBug с помощью ICQ
Да... мне кажется в Flash6 "граблей" будет не меньше.
APM, а можно "Анонс на Грабли"

Старый 06.11.2001, 12:01
APM вне форума Посмотреть профиль Найти все сообщения от APM
  № 4  
APM

Регистрация: Sep 2001
Адрес: Минск, РБ
Сообщений: 106
RE: MegaBug
Что значит "Анонс на Грабли" - не очень понял. Был в отпуске и еще
не вошел в форму. Если о планах на будущее, то в плане еще три части
- об особенностях программирования во флэш с философской точки зрения, об особенностях взимодействия различных событий,
и некоторые странности с некоторыми переменными. Может быть будет и еще что-то, но это как пойдет масть - мало на грабли наткнуться, надо еще и сообразить как с этим быть. А вообще-то мне хотелось бы попробовать показать как можно пользоваться граблями - некоторые вещи
при этом можно сделать так, что только ахнешь.

Создать новую тему   Часовой пояс GMT +4, время: 07:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

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

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


 


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


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