PDA

Просмотр полной версии : как можно устранить подтормаживание или ускорить выполнение скрипта


Llex3D
19.01.2007, 03:32
Доброго времени суток.

Сделал как положено, с применением метода инкапсуляции ( имеется ядро с набором функций и скин, который к ним обращается, когда загружается куда надо).
В общем, проблема в том, что скин меняет цвет, когда юзер водит по цветовой палитре, всё бы ничего, но вот анимацию самой палитры компьютер уже не тянет и наблюдаются тормоза.

При наведении юзером на одну из ячеек цветовой палитры, скниу передаётся комманда установить setTheme(bgCol, fgCol), а вот вся красота в том, что внутри этой функции выполняется вот что:


RGBtoHSBFgCol = _root.playeCore.RGBtoHSB(fgCol);
RGBtoHSBBgCol = _root.playeCore.RGBtoHSB(bgCol);

mc1Color = new Color (MC1);
mc2Color = new Color (MC2);
mc3Color = new Color (MC3);
..............
.............
mc34Color = new Color (MC34);


mc1Color.setRGB(_root.playeCore.HSBtoRGB(RGBtoHSBFgCol[0]*coef, RGBtoHSBFgCol[1]*coef, RGBtoHSBFgCol[2]*coef));
mc2Color.setRGB(_root.playeCore.HSBtoRGB(RGBtoHSBFgCol[0]*coef, RGBtoHSBFgCol[1]*coef, RGBtoHSBFgCol[2]*coef));
mc3Color.setRGB(_root.playeCore.HSBtoRGB(RGBtoHSBFgCol[0]*coef, RGBtoHSBFgCol[1]*coef, RGBtoHSBFgCol[2]*coef));
..............
.............
mc34Color.setRGB(_root.playeCore.HSBtoRGB(RGBtoHSBBgCol [0]*coef, RGBtoHSBBgCol [1]*coef, RGBtoHSBBgCol [2]*coef));


Функции RGBtoHSB и HSBtoRGB уже описывал вот в этом топике
RBGtoHSB и HSBtoRGB (http://flasher.ru/forum/showpost.php?p=605367&postcount=7)
только в этом топике они в виде прототипа...
с названия playeCore - сразу ясно что это и есть ядро, в ктором содержаться все функции.

Вот в чём вопрос: как-то возможно ускорить это всё, потому что если юзер быстро начинает водить по пресету, тоанимация пресета начинает тормозить, но цвет меняется ещё боле менее.

Может если разбить вычесления для мувиков в 3-4 функции, хотя попробовал, не выходит, что-бы одновременно выполнялось несколько функций...

etc
19.01.2007, 03:38
Слишком много вычислений. Почему нельзя загнать результат вычислений в одну переменную и отвещать всем сразу?

И потом, писать полсотни одинаковых строк смахивает на садо-мазо.

Nirth
19.01.2007, 03:41
спасибо автору, он продлил мою жизнь

Nirth
19.01.2007, 03:45
отсмеялся.

ты не называй это пожалуйста инкапсуляцией, у меня приступы начнутся.

ты про циклы знаешь? for там и тд

Kikasso
19.01.2007, 09:18
метод "упрощевания" через "циклизацию":

var bgArr:Array = new Array();
var num:Nubmer = сколько-всего-их

//инициация
for(var i:Number = 0; i< num ; i++){
bgArr[i] = new Color( this["MC" + (i+1)] );
}
//в функции
var arr:Array = RGBtoHSB(bgCol);
var newBG = HSBtoRGB (arr[0]*coef, arr[1]*coef, arr[2]*coef);
for( i = 0; i< num ; i++){
bgArr[i].setRGB(newBG);
}
Примерно так, не проверял и не собираюсь. От своей инкапсуляции откажитесь - это тормозит процесс.
50 одинаковых строк это сильно. Я видел до этого только 15 в серьезном проекте, отпаивали валерианкой.

etc
19.01.2007, 11:12
А здесь вообще нет никакой инкапсуляции.

Kikasso
19.01.2007, 12:45
А здесь вообще нет никакой инкапсуляции.
Я кавычки не поставил. Метод можно назвать "закинь код на антрессоли и доставай его оттуда"

Llex3D
19.01.2007, 13:24
мдя.....
Каждый объек получает получает разные цвета и coef для всех разный, цикли не прокатят.
Насколько помню, инкапсуляция - это когда ни инкапсулированый объект ни ядро не имею ни малейшего понятия о схеме реализации кода как в ядре, так и в инкапсулированом объекте.

Ув. Nirth Вы заметили хоть одно обращение на прямую к какой-то переменной из ядра? И вообще, лучше отложить все эти насмешки, а то уже был один топик, только со мной спорили __etc и iNilis. Я книги читал и хорошо помню что такое инкапсуляция. Я вам привел утрированный код, дабы отразить суть вопроса.

Kikasso
19.01.2007, 13:54
Я вам привел утрированный код, дабы отразить суть вопроса.
Шутка удалась, поздравляю.
Надо сокращать количество операций, причем серьезно.
вот это:_root.playeCore.HSBtoRGB(...)
работает заметно медленнее чем это:HSBtoRGB(...)

etc
19.01.2007, 14:14
получает разные цвета и coef для всех разный
А почему его нельзя вычислить в цикле? Даже если коеффициент кастомный, то он должен быть свойством обрабатываемого клипа.

Llex3D
19.01.2007, 15:41
2Kikasso
Это я прекрасно понимаю... _root.playerCore.HSBtoRGB(...) - это обращение к ядру из скина. Была мысль сделать вычисление всех зависимостей на уровне ядра с последующим созданием объекта типа colorScheme а скин при вызове setTheme() дёргал функцию из ядра

public function retriveColorScheme(){
return {colorSchemeObj:colorScheme }
}

и потом уже обладая всем набором цветов просто присваивал бы их нужным объектам.

2__etc
Все объекты, которым присваиваются цвета имеют различные имена и находятся в различных местах.
Выполнение расчета в цыкле зависимостей я себе просот не представляю. Вот каким образом для каждого элемента в отдельности в цикле высчетать coef, если я его ставлю таким, что-бы текст на черном фоне был более насыщенным по отношению к нему... В общем зависимости в цикле не посчитаются... Даже лучше не начинать об этом говорить. А то прийдётся очень много текста писать, а на это времени нет, надо думать как ускорить процесс...

Kikasso
19.01.2007, 16:11
2Kikasso
Это я прекрасно понимаю... _root.playerCore.HSBtoRGB(...) - это обращение к ядру из скина.
Это не обращение к ядру, это доставание из багажника.

Kikasso
19.01.2007, 16:20
Выполнение расчета в цыкле зависимостей я себе просот не представляю. Вот каким образом для каждого элемента в отдельности в цикле высчетать coef, если я его ставлю таким, что-бы текст на черном фоне был более насыщенным по отношению к нему... В общем зависимости в цикле не посчитаются...
а как у вас все реализовано? Просто назначен каждому колору свой coef?
Ну так назначьте вручную:
var bgArr:Array = new Array();
var o:Object;
var arr:Array;
var i:Number;
var newBG:Number;

//инициация

bgArr.push( {col: new Color( MC1), coef:123} );
bgArr.push( {col: new Color( MC2), coef:321} );
//и так далее...

var num:Nubmer = bgArr.length;

//в функции
arr = RGBtoHSB(bgCol);
newBG = HSBtoRGB (arr[0]*coef, arr[1]*coef, arr[2]*coef);
for( i = 0; i< num ; i++){
o = bgArr[i];
o.col.setRGB(newBG*o.coef);
}

etc
19.01.2007, 16:41
Все объекты, которым присваиваются цвета имеют различные имена и находятся в различных местах.
…
А то прийдётся очень много текста писать, а на это времени нет, надо думать как ускорить процесс...
Событийная модель в руки. А «писать много текста» уже и так пришлось.

Llex3D
19.01.2007, 18:22
Никаких событий не вешал, никаких циклов... Достаточно было перенести создание объектов new Color в кадр с инициализацией скина ( иначе они вызывались какждый раз вместе с setTheme()), и увидел что у меня на roullOur вызывалась перекраска, добавил интервало, для проверки находится ли мыша над пресетом и воаля, всё красиво и без тормозов :)