Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   что такое исключение ScriptTimeoutError и зачем оно нужно? (http://www.flasher.ru/forum/showthread.php?t=211604)

nelco 29.09.2015 11:42

что такое исключение ScriptTimeoutError и зачем оно нужно?
 
в книге Мука написано:
"Чтобы избежать появления исключений 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

Всесто тысячи слов.


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

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