PDA

Просмотр полной версии : Почему виснет флешка?


Gh >k
16.07.2007, 19:47
Я создаю игру, пока получается всё кроме 1 вещи - почемуто виснет флэш при выполнении некоторых кодов, пишет И"з-за скрипта, флэш ролик будет выполняться очень медленно. Остановить выполнение сценария?" . Причем в них совершенно нет ничего такого, отчего флэш могбы виснуть.
По теории так быть недолжно.Посмотрите пожалуйста исходник.
http://upload2.net/page/download/mGcUN8wj13QFS9R/platform.fla.html
Коды при которых виснет флэш я выделил серым. 1 код в главной временной шкале, а 2 в клипе "enemy11".

DJ_ManiaC
16.07.2007, 20:01
У меня почему-то не хочет открываться твой файл. Какая версия Флеша? Флешки и вообще программы виснут в основном из-за бесконечных циклов. Ты проверь если у тебя в коде есть циклы, то выполняются ли условия для них. Если условия не будут выполняться, то это будет бесконечный цикл и соответственно зависание.

ToXICus
16.07.2007, 20:18
Возможно также, что твой комп не в состоянии обработать цикл определеного кол-ва. Я, например на пне третьем циклом прибавлю к переменной +1 10000 раз, то увижу такое же сообщение.

Gh >k
16.07.2007, 21:25
Флэш у меня 8. Азу на компе стоит 512, да и дело не в нём.
Циклов у меня нет. Всё работает идеально, до того как в действие вступает 1 из 3 кодов.
1)
if (hit(bс, level)) {
_root._y -= gravity/1.3;
bc._y -= gravity/1.3;
bu._y -= gravity/1.3;
bd._y -= gravity/1.3;
br._y -= gravity/1.3;
bl._y -= gravity/1.3;
panel._y -= gravity/1.3;
fon1._y -= gravity/1.3;
}
Hit это функция проверки пересечения, bc.br.bl и т.д. - ролики, этот же код работает, но вместо bc вначале стоит bd.
2)
if (this.hitTest(_root.bc)) {
_root.gotoAndPlay(2);

}
На втором кадре только stop и всё. Без gotoAndPlay всё работает.
3)if (hit(bd, enemy11)) {
enemy11.swapDepths(1001);
enemy11.removeMovieClip();
}*/
Причом дело не в удаленни клипа enemy11, я убирал эти строки, оставлял только проверку(таких у меня 4, и все работают хорошо), всё равно висло.
В чом дело немогу понять.

А кстати, что пишет когда неоткрывается? Я сделал "сохранить и сжать" может из-за этого?

expl
17.07.2007, 00:18
Первая мысль - в твоей программе под 200000 hitTest-ов за раз вызывается (в функции hit) Пом это дохрена - пошоруди в этой функции

Torero
17.07.2007, 03:46
Диспетчер задач показывает загрузку процессора 99% - это жэсть.. Вероятно тот блок просто-напросто добивает систему..))

iNils
17.07.2007, 04:23
200000 я не нашел, от 442 до 999 за раз, но все равно это много, а учитывая фпс 120, вобще ужас. Флешка на моем Core 2 Duo 6700 конечно не виснет, но подтормаживает, и одно ядро грузит по полной.

Torero
17.07.2007, 05:49
попытался вникнуть в код... мама рОдная...
1.panel.power.text обновлять 120 раз в секунду не стоит.(равно как и все остальное)

2.Все эти bc,br,bl... нужно запихнуть внутрь thisball_mc и писать thisball_mc._x+=** вместо того чтобы двигать их по отдельности. А вообще, лучше избавься от них.

3.нафига нужна ф-я hit я вообще не понимаю. по-моему никто еще не отменил конструкции типа if (thisball.hittest(level)){ здесь в неск строчек без всяких bc,br..можно проверить: какая из сторон столкнулась с level-ом }
3а)если уж используешь bl/br, то замени их на простые дуги, вместе образующие круг.

4.Пропиши функции moveThisBallRight(),moveThisBallLeft()... и используй их при столкновениях и нажатиях, либо вообще ужми код до 1й ф-ии moveThisBall

5,6,7,.........∞ :)

З.Ы.2iNils: ответь пожалуйста на мой вчерашний вопрос по поводу шрифтов и памяти - понять хочу.

Gh >k
17.07.2007, 23:04
1.panel.power.text обновлять 120 раз в секунду не стоит.(равно как и все остальное)
Ну насчот fps я объясню. Я хотел чтобы шар спускался со скоростью но плавно, без прлетаний в землю. Но сколько бы я не увеличивал fps, шар спускался медленно, я поставил макс - бестолку, а потом я просто забыл его вернуть в нормальное состояние.
2.Все эти bc,br,bl... нужно запихнуть внутрь thisball_mc и писать thisball_mc._x+=** вместо того чтобы двигать их по отдельности. А вообще, лучше избавься от них.
Функция Hit не может проверять пересечение клипа 1-го уровня и 2-го уровня, я даже создал тему http://www.flasher.ru/forum/showthread.php?t=98578 чтобы узнать почему так .
3.нафига нужна ф-я hit я вообще не понимаю. по-моему никто еще не отменил конструкции типа if (thisball.hittest(level)){ здесь в неск строчек без всяких bc,br..можно проверить: какая из сторон столкнулась с level-ом }
Чтобы пользоваться hitTest-ом нужно описывать пересечение с каждым объектом, и они будут только прямоугольной формы, а с этой функцией можно просто рисовать что хочешь и не добавлять каждый раз код.
4.Пропиши функции moveThisBallRight(),moveThisBallLeft()... и используй их при столкновениях и нажатиях, либо вообще ужми код до 1й ф-ии moveThisBall
Код от этого меньше не станет. Покрайней мере я пытался.
и объясни пожалуйста остальные -4 ,5 ,6 ,.... может чтонибудь исправлю.
Проблема была не в fps и множественных провеках.У меня 512 азу и 2.4 проц, невиснет совсем когда я исправил глюки:
в 1 случае я просто удалил код и написал его же заново-точно такойже, и ЭВРИКА!!!! - перестало виснуть.
во 2 случае место gotoAndPlay я стал убавлять переменную lives и потом уже использовал gotoAndPlay и тоже перестало виснуть, хотя в причинах я неразобрался досихпор. Fps по прежнему 120, и кстати, почему он так медленно падает? по скрипту он должен палать на 480 пикселей, а там явно не дотягивает.

Torero
18.07.2007, 08:58
Я хотел чтобы шар спускался со скоростью но плавно
setInterval
и они будут только прямоугольной формы
согласен - моя неправда
не может проверять пересечение клипа 1-го уровня и 2-го уровняне проверял, но детектор направления столкновений можно и на 1й уровень поместить - накладывать его на координаты thisball при столкновении.
1.Код от этого меньше не станет. 2.Покрайней мере я пытался.1.станет 2.Москва не сразу строилась.
и объясни пожалуйста остальные -4 ,5 ,6 ,....повторного разбора этого кода не выдержу - сперва сделай его читабельным.
просто удалил код и написал его же заново-точно такойже, и ЭВРИКАты уж извини, в чудеса не верю.))

Fps по прежнему 120, и кстати, почему он так медленно падает? по скрипту он должен палать на 480 пикселей, а там явно не дотягивает.setInterval

З.Ы.С прискорбием убедившись в достоверности цитаты №2, залез в гугл (hitTest shape) и, не поверишь, по 1й-же ссылке нашел нормально работающий класс, определяющий пересечение шейпов, и точку вышеупомянутого пересечения.:) глянь на него - мож пригодится.http://www.gskinner.com/blog/archives/2005/10/source_code_sha.html
Даже если будешь юзать свой рукотворный хиттест, попробуй нарисовать в 1 клип - круг и еще 1 клип - hairline-дуга примерно в 1/10 круга, после чего, с определенной дискретностью(скажем 100), приравнивай координаты центра дуги координатам центра круга, в цикле(1->10) поворачивай дугу и хит-тести ее с уровнем.
все.. устал писать.. всем хорошего дня.

etc
18.07.2007, 10:02
Tolero, setInterval не может обеспечить плавность движения чего-либо. setInterval нужен там, где требуется определенные промежутки времени между итерациями, которые заведомо больше, чем промежутки между сменой кадров. В противном случае надо использовать onEnterFrame.

Torero
18.07.2007, 11:03
стоп.
1.Выполнение команды в интервале равном 1000/fps даст тот-же результат.
2.Интервал дает возможность привязываться к реальному времени вне зависимости от fps.
если я неправ, то почему?

З.Ы. Torero

etc
18.07.2007, 11:16
Потому что onEnterFrame срабатывает как раз в момент прорисовки кадра, а setInterval — необязательно.
Более того, интервал зависит от частоты кадров. Поэтому не имеет смысла что-то гонять по экрану с частотой бОльшей, чем реальная частота кадров (а onEnterFrame как раз выполняется с реальной частотой кадров).
Ничего, помимо дополнительных тормозов интервал в данном случае не приносит.

Torero
18.07.2007, 11:26
Ясненько. спасибо за ликбез.

Cкептик
18.07.2007, 14:08
Абсолютно не понял суть проблемы. На моем ноутбуке НИ МАЛЕЙШЕГО признака задержки работы или каких бы то ни было тормозов. Проверяйте компьютеры, наверное. :taunt:

Gh >k
18.07.2007, 19:05
сообщение отTorero
ты уж извини, в чудеса не верю.))
А ты сам попробуй заново напсать, у тебя тоже должно перестать виснуть.
сообщение отTorero
не проверял, но детектор направления столкновений можно и на 1й уровень поместить - накладывать его на координаты thisball при столкновении.
Уж извини я ничего не понял:wacko:
сообщение отTorero
повторного разбора этого кода не выдержу - сперва сделай его читабел
Посоветуй как это сделать, я сделал как мог, досих пор я не натыкался на исходники с нормальными коментариями, покажи хоть 1 читабельный код, и я исправлюсь.:rolleyes:
Ответьте пожалуйста на мой вопрос по fps , почему он стоит 120 а работает точно также как 12??? Меньше получается, а больше 12 неработает. (
сообщение отCкептик
Абсолютно не понял суть проблемы. На моем ноутбуке НИ МАЛЕЙШЕГО признака задержки работы или каких бы то ни было тормозов. Проверяйте компьютеры, наверное.
А ты убрал знаки коментариев? Я проблемные места кодов поставил в коментарии.
Тут исправил все глюки , почти доделал всю игру, но вылезла какаято непонатная фигня - виснет от обычного gotoAndPlay , просто нехочет переходить на другой кадр, даже если пишу в самом начале еода, а всё остальное нормально.
Вот исходник :
http://upload2.net/page/download/NzXzWNz1UZQwJ5Y/platform.fla.html