Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.11.2010, 21:32
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

setTimeout + перегруженый процессор = ???
да, я опят что-то тут пишу)) вот в чём проблема, у меня есть готовый скрипт(он есть ну я вам тут всё буду так писать, вы фантазируйтеD)
в котором есть рекурсия таймера, то бишь всеми любимая анимация, она работает себе спокойно, но мне вдруг надо остановить анимацию, замедлять! то бишь делать ещё одну рекурсию которая будет рекурсировать и замедлять первую(увеличивать просто её время вызова), но! через время когда она замедлиться надо будет остановить анимацию вообще, но не просто остановить на каком-то действии(например оно двигается и останавливаться) а чтобы оно остановилось в определённых условиях(например какой-то объект достигает своего апогей и снова начинает анимировать, и чтобы сначала он замедлялся, а потом уже остановился полностью когда конца достигнет апогея опять) но проблема в том, что как нам его остановить, на нужной нам точке, при том что он ещё двигаться. Мы узнаем его скорость и узнаем количество шагов анимации которые нужны для окончания этого апогея и просто ставим удаления таймера через время которое мы узнаем из ШАГИ(до конца апогея)*СКОРОСТЬ(которая понизилась до минимальной), теперь через данное время анимация доходит до конца, и сразу же останавливается, всё это работает, но проблема в том что когда процесор забит, когда ты открыл куча приложений, когда это происходит и ты мышку водишь со скоростью света)) то процессор не успевает за заданное время выполнять анимацию, и тогда!! тот таймер выключит первую анимацию через точное время, например 700мс, а на самом деле за 700 мс, анимация не дошла до своего апогея так как процессор забил на неё, потому что его пиляет пользователь своим бешенством! в итоге анимация закрывается, на каком-то корявом месте, вопрос в том как выполнить процесс медленной остановки анимации(рекурсивного таймера) чтобы при это анимация остановилась на определённом, нужном нам шаге?? просто я могу кинуть код этой системы, с примером, если конечно надо будет, но эта проблема меня очень сильно бесит так как в ХРОМЕ из-за его вкладок на которые выделен отдельный процесс всё работает зачётно, а в Опере которая у меня загружена 50 вкладками работает не правильно, я уже молчу как оно лагает на мое андроиде..))
Ответить с цитированием
  #2 (permalink)  
Старый 24.11.2010, 22:43
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Тут форум, а не литературный кружок!
Ответить с цитированием
  #3 (permalink)  
Старый 24.11.2010, 22:51
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

да, но можно вообще по теме, если надо пример, то так и говори, кто знает может тебе будет более понятен JS чем язык)))
Ответить с цитированием
  #4 (permalink)  
Старый 24.11.2010, 23:16
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Я больше двух предложений не осилил, поэтому предлагаю как-то более лаконично изложить суть и желательно с кодом
Ответить с цитированием
  #5 (permalink)  
Старый 25.11.2010, 00:13
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

ясно, сейчас с сервера сделаю ифрейм, просто том оно всё соединено с графикой, другими файлами, и надо много выкладывать, но я выкладу сам пример и сам код анимации и остановки(проверьте спокойно в хроме, а потом попробуйте в других браузерах при нагрузке процессора, короче нагрузите как-то фоново процессор)
от я сделал без всяких проверок вытянул кусок приложения(лучше открывайте в новом окне)):
<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 месяца назад, так что.....
... ну короче можете как обычно строго обсырать, но помогите, просто я думаю переделывать полностью, или поискать что можно изменить чтобы всё было корректно)

Последний раз редактировалось Slawaq, 25.11.2010 в 00:36.
Ответить с цитированием
  #6 (permalink)  
Старый 25.11.2010, 09:47
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Что-то типо такого использовать (суть):
var intervalID = setInterval(function(){
    element.style.top = (i--<=100) ? i+'px' : i = 0;
}, i);

window.clearInterval(intervalID);
Ответить с цитированием
  #7 (permalink)  
Старый 25.11.2010, 11:46
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

да, а если надо остановить на нужных мне комбинациях, это просто остановить когда оно на начало приходит, но потом мне сделать чтобы выводились мои комбинации, типа потом взять последнее значение переменной 'i' и запустить ещё Интервал на N-шагов чтобы прокрутило на мои комбинации. ну короче попробую через Интервалы тогда, позже, потом напишу результаты что вышло))
Ответить с цитированием
  #8 (permalink)  
Старый 25.11.2010, 23:41
Аватар для Slawaq
Профессор
Отправить личное сообщение для Slawaq Посмотреть профиль Найти все сообщения от Slawaq
 
Регистрация: 19.05.2010
Сообщений: 187

переписал функцию старта, работает уже более быстро, но только всё ровно, в мозилле с одной скоростью с под одной вкладки , а Оперу из под 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), ставлю им выграшние комбинации, и включаю снова интервал, только уже вложений в функцию "стоп", и ставлю в него прокручивание с интервалом которой был до остановки, и ставлю условие на клирИнтервал, типа если первый элемент, которому я поставил комбинацию что выпала, достиг нуля, то всё остановить, сейчас напишу теперь это всё и должно правильно работать, потом выложу ещё исходник функции стоп
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26
setTimeout() DjTarik Events/DOM/Window 44 11.08.2010 00:35
Аргументы в setTimeout - проблема в IE 6 micscr Общие вопросы Javascript 8 28.09.2009 13:08
setTimeout Воитель Общие вопросы Javascript 5 23.01.2009 10:36