Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как сделать что б не подтормаживало. (https://javascript.ru/forum/jquery/9328-kak-sdelat-chto-b-ne-podtormazhivalo.html)

Сергей Постовит 11.05.2010 13:57

Как сделать что б не подтормаживало.
 
Есть скрипт, выбирается 11 картинок - шариков и для каждого запускается функция moving - в нее передаются параметры сам шарик, переменная с - первый цикл движения или нет, координаты 5 точек и последняя переменная - находится шарик на краю экрана или в середине. Каждый шарик движется по своей траектории отлетает от стенок, как только шарик прошел свой путь 4 или 5 отлетов, запускается рекурсивная функция в последней анимации и процес повторяется.
Проблема в том что эта анимация тормозит, особенно в ие6-8, да и вобще везде.
Не знаю как ускорить, мне б идею какую-нибудь, в чем причина тормозов и как это можно лучше сделать.

$(window).load(function(){
	var circle1=$('#page1_circle1');
	var circle2=$('#page1_circle2');
	var circle3=$('#page1_circle3');
	var circle4=$('#page1_circle4');
	var circle5=$('#page1_circle5');
	var circle6=$('#page1_circle6');
	var circle7=$('#page1_circle7');
	var circle8=$('#page1_circle8');
	var circle9=$('#page1_circle9');
	var circle10=$('#page1_circle10');
	var circle11=$('#page1_circle11');
		
	moving1(circle1,1,0,48,15,100,100,65,35,0,0,0,true);
	moving1(circle2,1,0,61,35,100,100,10,85,0,0,0,true);
	moving1(circle3,1,19,51,0,20,15,0,100,30,80,100,false);
	moving1(circle4,1,40,39,0,40,65,0,100,60,20,100,false);
	moving1(circle5,1,51,46,100,34,85,0,0,5,45,100,false);
	moving1(circle6,1,56,13,33,100,0,50,68,0,100,35,false);
	moving1(circle7,1,72,22,100,15,76,0,0,40,35,100,false);
	moving1(circle8,1,86,18,100,18,0,18,18,0,60,100,false);
	moving1(circle9,1,82,18,50,100,40,0,0,25,80,0,false);
	moving1(circle10,1,86,12,45,100,35,0,0,20,75,0,false);
moving1(circle11,1,84,9,40,100,30,0,0,15,70,0,false);					
})
// движение шарика.
function moving1(circle,c,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,at_end) {
			 var speed_general=3/100;
			 var all_w=$('body').width();
			 var all_h=$('body').height();
		
			 if (x1==100) {x1 = Math.floor((Math.floor(all_w-circle.width()))/all_w*100)}
			 if (y1==100) {y1 = Math.floor((Math.floor(all_h-circle.height()))/all_h*100)}
			 if (x2==100) {x2 = Math.floor((Math.floor(all_w-circle.width()))/all_w*100)}
			 if (y2==100) {y2 = Math.floor((Math.floor(all_h-circle.height()))/all_h*100)}
			 if (x3==100) {x3 = Math.floor((Math.floor(all_w-circle.width()))/all_w*100)}
			 if (y3==100) {y3 = Math.floor((Math.floor(all_h-circle.height()))/all_h*100)}
			 if (x4==100) {x4 = Math.floor((Math.floor(all_w-circle.width()))/all_w*100)}
			 if (y4==100) {y4 = Math.floor((Math.floor(all_h-circle.height()))/all_h*100)}
			 if (x5==100) {x5 = Math.floor((Math.floor(all_w-circle.width()))/all_w*100)}
			 if (y5==100) {y5 = Math.floor((Math.floor(all_h-circle.height()))/all_h*100)}
			 var length=getLineLength(x1,y1,x2,y2);
			 var length2=getLineLength(x2,y2,x3,y3);
			 var length3=getLineLength(x3,y3,x4,y4);
			 var length4=getLineLength(x4,y4,x1,y1);
			
			 if (!at_end) {
			  var length5=getLineLength(x4,y4,x5,y5);
			  var length6=getLineLength(x5,y5,x2,y2);
			  var speed5=Math.floor(length5/speed_general);
			  var speed6=Math.floor(length6/speed_general);
			  }
			  var speed=Math.floor(length/speed_general);
			  var speed2=Math.floor(length2/speed_general);
			  var speed3=Math.floor(length3/speed_general);
			  var speed4=Math.floor(length4/speed_general);
		
	switch (c) {
		  case 1:	
			 circle.animate({top:y2+'%',left:x2+'%'},speed,'linear');
			 circle.animate({top:y3+'%',left:x3+'%'},speed2,'linear');
			 circle.animate({top:y4+'%',left:x4+'%'},speed3,'linear');
			 if (!at_end) {
			 circle.animate({top:y5+'%',left:x5+'%'},speed5,'linear');
			 circle.animate({top:y2+'%',left:x2+'%'},speed6,'linear',function(){moving1(circle,0,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,at_end)})
			}
			else {
			circle.animate({top:y1+'%',left:x1+'%'},speed4,'linear');
			circle.animate({top:y2+'%',left:x2+'%'},speed,'linear',function(){moving1(circle,0,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,at_end)})
		}
			 break;
		 case 0:
			circle.animate({top:y3+'%',left:x3+'%'},speed2,'linear');
			circle.animate({top:y4+'%',left:x4+'%'},speed3,'linear');
			if (!at_end) {
				circle.animate({top:y5+'%',left:x5+'%'},speed5,'linear');
				circle.animate({top:y2+'%',left:x2+'%'},speed6,'linear',function(){moving1(circle,0,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,at_end)});
			}
			else {
			circle.animate({top:y1+'%',left:x1+'%'},speed4,'linear');
			circle.animate({top:y2+'%',left:x2+'%'},speed,'linear',function(){moving1(circle,0,x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,at_end)});
			}
			break;
		}
}
// длина линии.
function getLineLength (x1,y1,x2,y2) {
   var x12=x2-x1;
   var y12=y2-y1;
   var lentgth_not_ready=Math.sqrt(Math.pow(x12, 2) + Math.pow(y12, 2));
   return lentgth_not_ready;
}

exec 11.05.2010 14:14

var width = $().width();
setInterval(function () {
	$(node).animate({
		marginLeft: width
	},
	1000).animate({
		marginLeft: 0
	},
	1000);
});

subzey 13.05.2010 00:57

Вы дергаете браузер почем зря. Для того, чтобы отработал jQuer'евский .width() или .height(), нужно обратиться к DOM, тот вызовет reflow, после этого вернет значение.

Сравните:
var was = new Date();
var jDB = $(document.body);
for(var i=0; i<1000; i++){
jDB.width(); // здесь мы вызываем функцию замера
}
var now = new Date();
alert(now.getTime() - was.getTime() + " мс")


var was = new Date();
var jDB = $(document.body);
for(var i=0; i<1000; i++){
jDB.foo; // а тут читаем гипотетическую переменную foo
}
var now = new Date();
alert(now.getTime() - was.getTime() + " мс")


Кешируйте значения!
Если размер объекта не меняется, незачем мерять его 40 раз в секунду. Если размер окна изменится, Вы узнаете об этм через событие resize.

Сергей Постовит 19.05.2010 12:07

ок,спасибо. Буду пробовать.


Часовой пояс GMT +3, время: 15:44.