PDA

Просмотр полной версии : тормозит мувик


ShuXer
26.06.2005, 20:17
Сделал мувик, в котором за курсором мыши ползает точка и рисуется её траектория с помощью
moveTo(oldx,oldy);
lineTo(x,y);
Через некоторое время мувик начинает жутко тормозить. Можно ли как-то сделать чтобы не тормозило? Возможно можно как-то производить ээ растеризацию или как это называется.. вообщем то, что делает команда Break Apart - над каждой прорисованной линией, чтобы они становились не векторными. Может от этого тормозить будет меньше?

MIX-er
27.06.2005, 00:00
он ентер фрейм юзаешь???

silin
27.06.2005, 00:42
Сделал мувик, в котором за курсором мыши ползает точка и рисуется её траектория с помощью
moveTo(oldx,oldy);
lineTo(x,y);
Через некоторое время мувик начинает жутко тормозить. Можно ли как-то сделать чтобы не тормозило? Возможно можно как-то производить ээ растеризацию или как это называется.. вообщем то, что делает команда Break Apart - над каждой прорисованной линией, чтобы они становились не векторными. Может от этого тормозить будет меньше?
в корень смотришь: количество векторов в твоем мувике пропорционально времени проигрывания, на каждой смене кадра плеер их перерисовывает - отсюда и тормаза
растеризировать их не получится, пока: были какие-то намеки на подобную штуку в 8-ой версии, но кто знает..

ShuXer
27.06.2005, 01:18
Да, onEnterFrame.

Жалко.. а может есть тогда какая-нибудь функция чтобы удалить линию? типа ластика. Чтобы при достижении определённого количества линий самые "старые" из них стирались.

silin
27.06.2005, 01:38
чтоб одну нет, тока все сразу - MovieClip.clear()
как вариант: рисовать в пустом мувике, считая количество линий, по достижении предела создавть новый и рисовать в нем, а предыдущий/предпоследний/и т.д. удалять..

kruasan
27.06.2005, 02:08
Не совсем понятно, зачем в каждом кадре запускать moveTo(oldx,oldy);
И еще, в данном случае по моему уместнее юзать не onEnterFrame а onMouseMove, более экономный расход ресурсов.

Предлагаю выход - "тушить" хвост линии через определенные интервалы времени. Типа пол линии в одном мувиклипе, а пол линии - в другом. Вторую половину плавно гасишь альфой, затем делаешь ей removeMovieClip(), шоб ресурсы не жрала. Первую половину обзываем "второй половиной", а линию продолжаем рисовать в новом эмптиМувиКлипе, который обзываем "первой половиной". Ну и так до бесконечности...

ShuXer
27.06.2005, 03:04
Я не подумал создавать для каждой линии пустой мувик...
Теперь я его создаю вот так

i++;
createEmptyMovieClip('mc'+i,i);
with ('mc'+i){
moveTo(_root.oldx, _root.oldy);
lineTo(_root.m._x, _root.m._y); //m - та самая точка которая бегает за мышкой
num = _root.i;
onEnterFrame = function(){
if (num<_root.i - 50) removeMovieClip(this);
}
}

Получается много-много мувиков с прямыми mc1...mcN . Я хотел привязать к onEnterFrame каждого из них проверку, чтобы при количестве >50 он удалялся. Но я не очень знаком вообще с ActionScript'ом и поэтому ничё не получается.. - Точка стоит на месте и не двигается. Что я делаю не так?

silin
27.06.2005, 19:18
вариант :сразу создаем скока надо, а потом по очереди в них рисуем, ну и альфу походу меняем
var num=50
var p=this.createEmptyMovieClip('p',-1);
for(var i=num,lines=[];i--;)lines[i]=this.createEmptyMovieClip(i,i);
this.onMouseMove=function(){
var x=p._x, y=p._y;
p._x=_xmouse,p._y=_ymouse;
n++;
n%=num;
with(lines[n]) clear(),lineStyle(0,0),moveTo(x,y),lineTo(p._x,p._y);
for(var i=num;i--;)lines[i]._alpha=((i+num-n)%num)*100/num;
}

Буньков Максим
27.06.2005, 20:15
А если не хочишь оптимизировать код... тода покупай Крутой Athlon 64 :)) там дольше будет работать без тормазов, ди ОЗУ побольше надо...

E-mail
28.06.2005, 15:15
Навскидку могу предложить один способ без использования Movie Clipов,создаёшь примерно три ключевых кадра на двух слоях на первом слое первом кадре рисуешь что надо,на втором удаляешь,одновременно на втором слое рисуешь.На третьем посылаешь на первый,где одновременно опять рисуется первый слой и удаляется второй.Частоту кадров естессно желательно поднять до 24...можно и побольше.Загрузка проца при этом где то 1-2 процента,но у меня АМД 3000+ :)

ShuXer
29.06.2005, 13:51
silin, спасибо, твой код очень помог. Только надо там в начале ещё указать n = 0;
У меня появился новый вопрос: вот я создаю допустим мувики
for (i = 0;i<50;i++) {
createEmptyMovieClip('m'+i,i);
.......
}

а потом хочу очистить один: пишу
with ('m25') clear();
Но стираются все мувики а не только этот :(
В чём же дело?

ShuXer
29.06.2005, 14:12
я сам разобрался))
вот
maxnum = 100;
lines = [];
for (i = 1; i<=maxnum; i++) lines[i] = this.createEmptyMovieClip(i,i);
i = 0;
this.onEnterFrame = function() {
//здесь изменяем a, xspeed, yspeed
oldx = m._x;
oldy = m._y;
m._x += xspeed;
m._y += yspeed;
if (i==maxnum) i = 1;
else i++;
with (lines[i]){
clear();
lineStyle(1, 0x000000, a);
moveTo(oldx, oldy);
lineTo(m._x, m._y);
}
}
Всё работает. Спасибо всем за внимание)