Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.01.2014, 04:20
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

Асинхронная модель. События
Всем привет, ребята!

Разрабатывая искусственный интеллект для зомби в моей игре столкнулся с проблемой.
А именно достаточно ресурсоемкий расчет траектории движения зомби который просчитывается циклом for.

Как я понял я не учел того факта, что при выполнении цикла for, сервер будет "стоять" до полного выполнения цикла.
Почитав статьи я понял, что необходимо использовать асинхронную модель программирования основанную на событиях.

Сейчас пытаюсь понять, как правильно организовать данный модуль.
То есть как я понимаю - создаем функцию, в которую передаем уникальный идентификатор, условие, функцию.

Я для теста написал следующий код:

Event = {
    start: function(ID, IF, FUNCTION, CALLBACK, INDEX) {
        var i = !INDEX ? 0 : INDEX;

        FUNCTION(i);
        if (eval(IF)) {
            i++;
            setTimeout(function() {
                Event.start(ID, IF, FUNCTION, CALLBACK, i);
            }, 1);
        }

    }
}

Event.start('fuck1', 'i < 1000', function(i) {
    console.log('test ' + i);
});


Начав выполнять данную функцию без "setTimeout", скрипт висел так же как и при выполнении for. Добавил setTimeout, и функции в скрипте стали выполняться параллельно) Но при этом заметно дольше, чем for.

Меня интересует вопрос, правильно ли я понимаю логику асинхронной работы? Возможно ли как то ускорить процесс?
Может быть есть какие то ню-ансы, которые необходимо учесть)
Буду очень рад любым мыслям и советам!

Заранее спасибо!

Последний раз редактировалось Dorian_bs, 09.01.2014 в 04:23.
Ответить с цитированием
  #2 (permalink)  
Старый 09.01.2014, 04:34
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Отдавайте данные на обработку серверу или используйте Web Workers
http://habrahabr.ru/post/132785/
Ответить с цитированием
  #3 (permalink)  
Старый 09.01.2014, 12:53
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

Сообщение от Poznakomlus Посмотреть сообщение
Отдавайте данные на обработку серверу или используйте Web Workers
http://habrahabr.ru/post/132785/
Кажется вы хотели написать клиенту? Дело в том, что у меня все функции обрабатывает сервер на nodejs и вся игровая логика.
Ответить с цитированием
  #4 (permalink)  
Старый 09.01.2014, 13:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от Dorian_bs
Меня интересует вопрос, правильно ли я понимаю логику асинхронной работы?
Асинхронность в JS может породить только
setTimeout(); 
setInterval();


Сообщение от Dorian_bs
Возможно ли как то ускорить процесс?
Улучшать/Оптимизировать функцию расчета...

И помнить, что таймауты вещь ооочень относительная. При увеличении нагрузки на клиента они только возрастают. Т.е. твоя 1 - чистая фикция. Браузер будет запускать "потоки" когда сочтет это возможным...
Ответить с цитированием
  #5 (permalink)  
Старый 09.01.2014, 14:03
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

для начала убрать eval
Ответить с цитированием
  #6 (permalink)  
Старый 09.01.2014, 15:48
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

ksa, спасибо!

melky, спасибо за совет! Просто мне показалось, что обработка evel'oм данной строки не будет так ресурсоемко, ибо мы не выполняем большую функцию, а всего лишь до 10 символов.
Или я не прав?
Ответить с цитированием
  #7 (permalink)  
Старый 09.01.2014, 15:52
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от Dorian_bs
мне показалось, что обработка evel'oм данной строки не будет так ресурсоемко
Тут eval() не в почете... За него и карму могут минусануть.
Ответить с цитированием
  #8 (permalink)  
Старый 09.01.2014, 15:58
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от ksa Посмотреть сообщение
Асинхронность в JS может породить только
setTimeout(); 
setInterval();
AJAX, setImmediate, webWorkers, postMessage и т.д.

Часть АПИ зависит от окружения, так например в ноде ещё больше этот список.

Dorian_bs, используй WebWorkers - для твоих вычислений будет создан отдельный поток, который не будет лочить вкладку. Вот есть сахарная обёртка над воркерами https://github.com/padolsey/operative
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 09.01.2014 в 16:06.
Ответить с цитированием
  #9 (permalink)  
Старый 09.01.2014, 16:19
Профессор
Отправить личное сообщение для Dorian_bs Посмотреть профиль Найти все сообщения от Dorian_bs
 
Регистрация: 24.03.2011
Сообщений: 217

ksa, ой, как тут с этим строго))) Буду знать))

kobezzza, огромное спасибо!!
То есть как я понял, operative - это скрипт, который выступает как модулем в node.js, так и просто скриптом для браузеров, который служит для работы с WebWorkers и он позволяет делать циклические вычисления, при этом не заставляя систему висеть?)
Я правильно понял?)

Последний раз редактировалось Dorian_bs, 09.01.2014 в 16:32.
Ответить с цитированием
  #10 (permalink)  
Старый 09.01.2014, 16:28
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Dorian_bs Посмотреть сообщение
kobezzza, огромное спасибо!!
То есть как я понял, operative - это модуль в node.js для работы с WebWorkers и он позволяет делать циклические вычисления, при этом не заставляя систему висеть?)
Я правильно понял?)
Это либа в первую очередь для браузера, т.к. WebWorkers - это АПИ браузера для создания потоков, но у него голое АПИ не очень удобное, вот operative добавляет сахара.

В Node.js для разгрузки циклов юзай nextTick и setImmediate.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 09.01.2014 в 16:31.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм работы обработчика события salikoff Events/DOM/Window 1 20.09.2012 23:46
Архитектура server-side приложения B~Vladi Оффтопик 69 14.07.2012 03:09
Дебаг js, или как найти обработчик события для тега jimm88 Events/DOM/Window 1 18.04.2012 15:11
Как сделать чтобы клавиатурные события пропускались сквозь флешку? khusamov Общие вопросы Javascript 3 11.02.2012 16:48
Передача параметров в колбэки и дальнейшее их вешанье на события. Gremlin Общие вопросы Javascript 17 13.08.2011 08:54