![]() |
onClipEvent
Приветствую!
Напишите пожалуйста как лучше заменить конструкцию -OnClipEvent(enter frame){.... И опишите почему её не следует использовать(с тормозаааааааами я уже встретился !!!) В поиске был(во всех темах просто говорят, что это плохо)! P.S. Заранее благодарен! |
это зависит от задачи
|
Цитата:
Код:
мувиклип.onEnterFrame = function () {OnClipEvent плох потому что, надо тратить время на поиск кода среди мувиклипов, хранить код в одному месте удобнее и конструкция моральна устарела. |
Спасибо!
А будет ди этот код работать быстрее? Ещё вопрос у моего мува fps=12, значит onEnterFrame будет работать 12 раз?А можно например 2 раза(с дополнительной проверкой я сделал, но может есть другой способ)(вообще хочу понизить нагрузку, а то мув тормозит!) P.S. Заранее биг спасибо!!!!!!! |
если не хочешь вызывать функцию в каждом кадре, используй setInterval().
|
причиной тормозов может быть не только onEnterFrame
|
По смыслу, onEnterFrame, "когда загружается кадр". Это событие происходит каждый раз при загрузке нового кадра, при fps 12 оно в идеале будет возникать 12 раз в секунду. (Если анимация или вычисления сложные, оно будет возникать реже)
Отказ от on(ClipEvent) позволит сделать твои ролики быстрее. |
Самое выгодное имхо в испльзовании обработчика события onEnterFrame вместо onClipEvent(enterFrame) в том, что его можно удалять и создавать заново.
|
Nirth ты не мог бы поподробнее описать динамическое добавление удаление(эта тема может помочь мне повысить скорость)
Заранее спасибо! Homo sapiens спасибо за интересный ответ! Т.е onClipEvent при любых обстоятельствах выполняется n раз(n=fps), а onEnterFrame динамически в зависимости от нагрузки(я правильно понял?), если это так то жить мне станет легче :) |
Beta-tester почитай в хелпе про delete
|
Вот этот delete:
delete (reference); ? Или какой-то другой? |
в хелпе только один delete
|
Есть еще одна полезность заставляющая отказаться от onClipEvent. Это область видимости переменных. Если мы запишем такой код в главной временной шкале,
Код:
var myVar = 'ok';Код:
onClipEvent (enterFrame) {--а удалять обрабочик onEnterFrame(равно как и все остальные функции) мона так: Код:
delete onEnterFrame;Код:
onEnterFrame=null |
Насчёт "не выполняется" есть некоторое сомнение, но проверить на практике можно вот так:
Код:
this.createTextField("fps_txt", 0, 10, 10, 100, 20);з.Ы. И не смотрите на значения чисел в цикле. з.Ы.Ы. В примере установлено 120 fps. |
Цитата:
Цитата:
Цитата:
Код:
this.createTextField("fps_txt", 0, 10, 10, 100, 20); |
2 ETC, странный у тебя какой то тест... Я его себе скопипастил, запустил... а он просто повесил плейер... Ты его хоть тестировал?
По поводу присвоение null или delete, насколько я понимаю, это одно и тоже, в первом случае объект напрямую помечается для удаление сборщиком мусора, во втором, при очередном проходе, сборщик найдя нулевой указатель сам удалит объект. С учётом того, что сборщик мусора проходит с определённым периодом, вряд ли в случае delete объект будет удалён раньше... |
Код:
var count = 0; |
Разница получается минимальная. Ради интереса можно закомментить test.clear();
|
Конечно тестил, надо было не прерывать.
Madasan, твой пример мне непонятен, this в функции enteRFrame куда ссылается? delete удаляет саму функцию из памяти, а не объект, который её содержит. Тем более, ты после удаления функции (которой ещё нет), присваиваешь ей значение и конечно же видишь тормоза. Я не вижу смысла удалять функцию перед тем, как заново ей присваивать значение. Как правило, если нужно остановить onEnterFrame, то останавливается он не на время выполнения двух строк кода, а на гораздо большее. Возможно, постоянно медленно работающее приложение тебя устроит больше, чем приложение, которое, хоть и подтормаживает при выполнении действий с onEnterFrame, но после их выполнения работает ощутимо быстрее... null не удаляет функцию из памяти, это можно увидеть в trace: Код:
Movie Clip: Target="_level0.test_5014mc"Даже если не подписан, всё равно у клипа есть переменная, которая в любом случае отжирает память. А вот результат с delete: Код:
Movie Clip: Target="_level0.test_6815mc"Функцию нужно убить, если она вам не нужна, в просто так забивать null-ем память лишний раз не стоит. Кто-то скажет, что мол, такого количества объектов врядли у кого-то будет (а падение производительности в два раза ощутимо). Согласен, но если часть onEnterFrame выполняет сложные вычисления, а другая часть просто отжирает процессорное время, ничего не делая, то потом можно не удивляться, почему тормозит... |
Homo Sapiens, а что иллюстрирует твой пример? У тебя один объект, после выполнения действий ты или удаляешь или присваиваешь null функции. Но count тут причём? С одним объектом разница между null и delete не ощутима в плане производительности (тем не менее, в памяти остаётся onEnterFrame, если использовать null)
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
А так, все правильно , и разница действительно есть и null для того и существует, чтобы переменная была, пусть и пустая, но нам она еще пригодиться.:D |
Смысл кода такой, что есть два обработчика OnEnterFrame, первый считает число кадров, а второй выполняет некоторые действия, например программное рисование. Через 5 секунд мы отключаем второй обработчик 2 разными способами
Код:
test.onEnterFrame = null;Код:
delete test.onEnterFrame;2 ETC. Запости как ты трассировал переменные. Кстати, ты не думаешь о том, что обрботчик onEnterFrame вызывается кодом, подобным Код:
function CallEnterFrame(target) |
Ctrl+Alt+V я трейсил.
Результат у тебя не меняется в силу того, что при наличии всего одного объекта разница не ощутима. Функция может и не вызываться, но при null она в памяти есть. |
Код:
for (i = 0; i < 2000; i++) {Код:
for (i = 0; i < 2000; i++) {кому не нравится отсутствие onEnterFrame во втором примере, может сделать так Код:
f = function () { |
2 ETC, спасибо, не знал про это
2 All, ну бог знает, я не знаю наверняка, вполне возможно, что delete работает действительно быстрее... |
Цитата:
|
именно
|
Извиняюсь за вопрос....а часто нужно бывает больше 10ти enterFrame'ов?
|
мораль проста: просто так одним только энтерфреймом машину не повесишь - надо проявить смекалку :~)
|
Цитата:
|
Цитата:
Так почему gc должен высвобождать ресурсы? |
Antares, ок. Но есть утверждение, что после delete создание нового onEnterFrame займёт времени больше, чем присваивание другого значения...
|
null это значение??? null - это null. 0 - значение
|
Цитата:
Присваивание другого значения: Код:
f = function () {создаем новый onEnterFrame: Код:
f = function () { |
Код:
var allObjects:Array = new Array();Потом раскоментируем меняем местами закомментированные строки. Особенно хорошо видно при больших значениях (> 10000). P.S. Текстовое поле info создаём ручками :) |
Пример достаточно нагляден. delete работает на самом деле ощутимо быстрее чем присвоение null. Но присвоение null тоже работает...
|
Код:
var allObjects:Array = new Array(); |
Цитата:
|
Код:
var allObjects:Array = new Array(); |
undefined во Flash сделано исключительно для удобства дизайнеров, чтобы им не напрягаться. Буквально это значит "не определена". В нормальных языках программирования, попытка использовать неопределённую переменную приводит к ошибке компиляции. И как правило, эти языки в принципе не дают объявить неинициализированную ссылочную переменную, требуя присвоить null, если пока нельзя определить конкретную цель для указателя.
|
| Часовой пояс GMT +4, время: 07:14. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.