PDA

Просмотр полной версии : что такое исключение ScriptTimeoutError и зачем оно нужно?


nelco
29.09.2015, 11:42
в книге Мука написано:
"Чтобы избежать появления исключений ScriptTimeoutError, весь код должен быть разработан таким образом, чтобы его выполнение завершалось в течение интервала, определяемого параметром компиляторатах-execution-time. Для выполнения задачи, которой требуется больше времени, чем позволяет разрешенный лимит времени, разбейте ее на части, которые могут быть выполнены в течение времени, определяемого параметром max-execution-time, а затем используйте класс Timer, чтобы организовать выполнение этих частей кода."

не понимаю ничего, как это работает?

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

caseyryan
29.09.2015, 13:18
Допустим есть цикл (но не обязаетльно цикл), в котором очень увесистая обработка объектов, например перекодировка изображений. Или цикл, с бесконечным выполнением, как например while(true) {}
Если не будет таймаута на выполнение, такой код запросто повесит все приложение или даже все устройство. А по таймауту, зависший код в любом случае рубанется

undefined
29.09.2015, 21:41
т.е. код выполняется как-то частями между событиями ENTER_FRAME что ли? и может не успеть выполниться, если слишком много кода или про что это? :\\
Да. Мук предлагает выполнять код между вызовами таймера TimerEvent.TIMER,но можно и по энтер_фрейм. Следующий ENTER_FRAME не наступит пока код текущего не закончит выполняться.Тут можно не волноваться.С таймером тоже самое.

nelco
29.09.2015, 21:49
а я почему-то подумал, что наоборот... что следующий ENTER_FRAME наступит сам и если за это время код предыдущего не выполнился, то всё - вылезет это исключение... не понимаю вообще как код зависит от ENTER_FRAME?
получается, что ENTER_FRAME есть как бы двух видов что ли? один - который принудительный (24 кадра в сек.) а второй - это когда сделали addChild в коде? и при чём тут код?
или имеется в виду только код, когда функция выполняется при подписке на событие ENTER_FRAME?

Добавлено через 4 минуты
до прочтения этой главы думал, что кадры (и соответственно события кадров ENTER_FRAME) есть только у MovieClipa... а теперь вроде как, получается, что и у Sprite есть? или это ENTER_FRAME сцены? ещё сильнее запутался, какой там код может не успеть выполниться... :\

Tails
29.09.2015, 22:14
Всё очень просто. Флешь плеер работает таким образом:

КАДР 1:
1. Выполняет ваш код.
2. Рисует картинку на экране.

КАДР 2:
1. Выполняет код.
2. Рисует картинку.

КАДР 3:
1. Выполняет код.
2. Рисует картинку.

...

И так бесконечно, пока вы не закроете окно флешь плеера.

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

Событие EnterFrame получают любые дисплей объекты, подписавшиеся на него. Даже те, что не мувиклипы и даже те, что не находятся на экране. Вы правильно поняли, это событие относится к сцене.

nelco
29.09.2015, 22:33
а если у меня на сцене кодом создан только один спрайт, то всё равно идёт обновление stage 24 кадра в сек даже если я не делаю addChild?

undefined
29.09.2015, 23:08
то всё равно идёт обновление stage 24 кадра в сек даже если я не делаю addChild?
Да.Рассматривай событие ENTER_FRAME как метроном, который тикает независимо от кода.Если код тяжелый -тикание замедляется.Если кода нет совсем - тикает с частотой = fps. У большинства дисплей обжектов этот метроном свой.Для производительности предпочтительнее подписываться на ENTER_FRAME стэйджа и делать все обновления дисплей листа там.
Событие EnterFrame получают любые дисплей объекты
Все же не любые.TextField, например, DO но энтер_фрейм не кидает.

neonoviiwolf
30.09.2015, 00:16
энтер-фрейм что-то вроде того же таймера, вы указываете максимальное количество кадров в секунду, а вот успеет ли он их выполнить, вопрос второй. К примеру создайте движущийся объект и поиграйтесь с количеством кадров

ZackMercury
30.09.2015, 00:46
У большинства дисплей обжектов этот метроном свой.
Это как так? ENTER_FRAME дословно переводится как "Вход в кадр", а ещё есть событие EXIT_FRAME, это "Выход из кадра". И вход и выход для всех ДО синхронизированы.
Для производительности предпочтительнее подписываться на ENTER_FRAME стэйджа и делать все обновления дисплей листа там.
Для производительности ли, или для идеализации кода, предпочтительнее подписываться на ENTER_FRAME в мейне, и обновлять всех детей с помощью метода update, в который передавать кол-во прошедшего времени. При этом нигде и ни при каких обстоятельствах больше не подписываться на ENTER_FRAME.

alatar
30.09.2015, 11:22
Всесто тысячи слов (http://www.craftymind.com/updated-elastic-racetrack-for-flash-9-and-avm2/).

Tails
30.09.2015, 11:28
Вот! Я эту статейку тоже искал, но не нашёл. )