setTimeout + перегруженый процессор = ???
да, я опят что-то тут пишу)) вот в чём проблема, у меня есть готовый скрипт(он есть ну я вам тут всё буду так писать, вы фантазируйте:DD)
в котором есть рекурсия таймера, то бишь всеми любимая анимация, она работает себе спокойно, но мне вдруг надо остановить анимацию, замедлять! то бишь делать ещё одну рекурсию которая будет рекурсировать и замедлять первую(увеличивать просто её время вызова), но! через время когда она замедлиться надо будет остановить анимацию вообще, но не просто остановить на каком-то действии(например оно двигается и останавливаться) а чтобы оно остановилось в определённых условиях(например какой-то объект достигает своего апогей и снова начинает анимировать, и чтобы сначала он замедлялся, а потом уже остановился полностью когда конца достигнет апогея опять) но проблема в том, что как нам его остановить, на нужной нам точке, при том что он ещё двигаться. Мы узнаем его скорость и узнаем количество шагов анимации которые нужны для окончания этого апогея и просто ставим удаления таймера через время которое мы узнаем из ШАГИ(до конца апогея)*СКОРОСТЬ(которая понизилась до минимальной), теперь через данное время анимация доходит до конца, и сразу же останавливается, всё это работает, но проблема в том что когда процесор забит, когда ты открыл куча приложений, когда это происходит и ты мышку водишь со скоростью света)) то процессор не успевает за заданное время выполнять анимацию, и тогда!! тот таймер выключит первую анимацию через точное время, например 700мс, а на самом деле за 700 мс, анимация не дошла до своего апогея так как процессор забил на неё, потому что его пиляет пользователь своим бешенством! в итоге анимация закрывается, на каком-то корявом месте, вопрос в том как выполнить процесс медленной остановки анимации(рекурсивного таймера) чтобы при это анимация остановилась на определённом, нужном нам шаге?? просто я могу кинуть код этой системы, с примером, если конечно надо будет, но эта проблема меня очень сильно бесит так как в ХРОМЕ из-за его вкладок на которые выделен отдельный процесс всё работает зачётно, а в Опере которая у меня загружена 50 вкладками работает не правильно, я уже молчу как оно лагает на мое андроиде..)) |
Тут форум, а не литературный кружок!
|
да, но можно вообще по теме, если надо пример, то так и говори, кто знает может тебе будет более понятен JS чем язык)))
|
Я больше двух предложений не осилил, поэтому предлагаю как-то более лаконично изложить суть и желательно с кодом
|
ясно, сейчас с сервера сделаю ифрейм, просто том оно всё соединено с графикой, другими файлами, и надо много выкладывать, но я выкладу сам пример и сам код анимации и остановки(проверьте спокойно в хроме, а потом попробуйте в других браузерах при нагрузке процессора, короче нагрузите как-то фоново процессор)
от я сделал без всяких проверок вытянул кусок приложения(лучше открывайте в новом окне)): <iframe src='http://75.126.94.196/~oldslots/VK/forForumJavascript.ru.php' width='700px' height='500px'></iframe> <a href='http://75.126.94.196/~oldslots/VK/forForumJavascript.ru.php' target="_blank">затухающая анимация</a> от у меня объект Слоты(этот барабан) toSlots = { stops:{ 1:false, //это номер линии барабана, если будет 1 тогда рекурсия не выполняется 2:false, 3:false }, start: function(jk,s,sp){ //от запуск, сразу изменяюсь за всякие переменные, ну короче seek это количество пикселей на сколько падает за один шаг элемент, а спид частота рекурсии, и это тоже объекты, только они не тут объявлены akey[jk]==0 seek[jk]=s; speed[jk]=sp; toSlots.stops[jk]=false; for(ou=1,oi=-140;ou<9;ou++,oi+=35){ document.getElementById('cm'+jk+''+ou).style.top=oi+'px'; document.getElementById('cm'+jk+''+ou).src='data/CM'+ou+'.png'; //каждая картинка что крутиться имеет адрес типа data/CM1.png, data/CM2.png, всего 9 их } rec[jk] = function(j){ tm[j] = setTimeout(function() { if(toSlots.stops[j]){ }else{ for(by[j]=1;by[j]<9;by[j]++){ ih[j]=Number(document.getElementById('cm'+j+''+by[j]).style.top.slice(0,(document.getElementById('cm'+j+''+by[j]).style.top.length-2))); //да и я знаю парсеИнт тут надо, а не это хрень что я написал , но сейчас это роли не играет if(ih[j]>104){icm[j]=-170+(ih[j]-105); }else{icm[j]=Number(seek[j])+ih[j];} document.getElementById('cm'+j+''+by[j]).style.top=icm[j].toString()+'px';} setTimeout(arguments.callee, speed[j]);} }, speed[j]); } rec[jk](jk); }, stop: function(n,wc1,wc2,wc3){ //от остановка, функция запускается когда приходит результат с сервера, он парситься и вызывается, и вызываются 3 функции через пол секунды, wc = первая картинка что выпадет и wc2,wc3 тоже) setTimeout(function(){ if(seek[n]>1){ seek[n]=Number(seek[n])-1; setTimeout(arguments.callee, 500); //сначала уменьшаю чтобы добавляло по 1 пикселю, кстати когда запускается старт он запускается с параметрами (n,4,4), скорость как тут видно 4 и seek; }else{ setTimeout(function(){ if(speed[n]<20){ speed[n]=Number(speed[n])+8; setTimeout(arguments.callee, 500); //теперь повышаем интервал }else{ for(bf[n]=1;bf[n]<9;bf[n]++){ ik[n]=Number(document.getElementById('cm'+n+''+bf[n]).style.top.slice(0,(document.getElementById('cm'+n+''+bf[n]).style.top.length-2))); if((ik[n]>-36)&&(ik[n]<0)){ //тут проверяется какая картинка находиться ближе всего к 0 координате, то есть к верху, и потом просчитываться сколько ей надо времени чтобы полностью опуститься до 0, и потом моя комбинации что сигали ставятся в следущии 3, и потом ещё прокручую на 3 картинки(1 картинка = 30 пикселей+5 отступление и их 3 должно прокрутить 105, но пишу 110, чтобы не было под полный ноль) setTimeout(function(){ sE=Number(bf[n]); if((sE-1)==0){ub1=8}else{ub1=sE-1}; if((ub1-1)==0){ub2=8}else{ub2=ub1-1}; if((ub2-1)==0){ub3=8}else{ub3=ub2-1}; document.getElementById('cm'+n+''+ub1).src='data/CM'+wc3+'.png'; document.getElementById('cm'+n+''+ub2).src='data/CM'+wc2+'.png'; document.getElementById('cm'+n+''+ub3).src='data/CM'+wc1+'.png'; setTimeout(function(){toSlots.stops[n]=true},110*speed[n]);},(Number(ik[n])*-1*speed[n])) break;} } } },500) } },1000); } } я конечно подозреваю что это скорее всего полный МУДАК КОД, но всё таки посмотрите)(у меня всё таки за спиной одна только книга Флэнагана, и я её дочитал только 3 месяца назад, так что..... ... ну короче можете как обычно строго обсырать, но помогите, просто я думаю переделывать полностью, или поискать что можно изменить чтобы всё было корректно) |
Что-то типо такого использовать (суть):
var intervalID = setInterval(function(){ element.style.top = (i--<=100) ? i+'px' : i = 0; }, i); window.clearInterval(intervalID); |
да, а если надо остановить на нужных мне комбинациях, это просто остановить когда оно на начало приходит, но потом мне сделать чтобы выводились мои комбинации, типа потом взять последнее значение переменной 'i' и запустить ещё Интервал на N-шагов чтобы прокрутило на мои комбинации. ну короче попробую через Интервалы тогда, позже, потом напишу результаты что вышло))
|
переписал функцию старта, работает уже более быстро, но только всё ровно, в мозилле с одной скоростью с под одной вкладки , а Оперу из под 20-25 вкладок, так в Опере быстрей, ну а хром ещё быстрей)) от как переделал:
start: function(jk){ var i=Array(); var t=Array(); for(j=-5;j<4;j++){ i[j+5]=j*35; //установка элементов на начальные позиции(чтобы некоторые были сверху, а некоторые снизу) } var tm[jk] = setInterval(function(){ for(m=0;m<8;m++){ t[m] = ((i[m]+=4)<=105) ? i[m]+'px' : i[m] = -175; if(t[m]==105){t[m]+='px'} document.getElementById('cm'+jk+''+(m+1)).style.top=t[m];} }, 5); } в связи с этим я подумал что нельзя будет решить с тем что некоторые функции лагают и их точное время окончания вычислить нельзя, но я подумал, что надо просто будет остановить анимацию, то бишь я понижаю чистоту интервала, останавливаю, ищю три последовательных элемента, что не находятся в промежутке(0-105), ставлю им выграшние комбинации, и включаю снова интервал, только уже вложений в функцию "стоп", и ставлю в него прокручивание с интервалом которой был до остановки, и ставлю условие на клирИнтервал, типа если первый элемент, которому я поставил комбинацию что выпала, достиг нуля, то всё остановить, сейчас напишу теперь это всё и должно правильно работать, потом выложу ещё исходник функции стоп |
Часовой пояс GMT +3, время: 16:47. |