Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Асинхронная модель. События (https://javascript.ru/forum/misc/44160-asinkhronnaya-model-sobytiya.html)

Dorian_bs 09.01.2014 04:20

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

Разрабатывая искусственный интеллект для зомби в моей игре столкнулся с проблемой.
А именно достаточно ресурсоемкий расчет траектории движения зомби:( который просчитывается циклом 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.

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

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

Vlasenko Fedor 09.01.2014 04:34

Отдавайте данные на обработку серверу или используйте Web Workers
http://habrahabr.ru/post/132785/

Dorian_bs 09.01.2014 12:53

Цитата:

Сообщение от Poznakomlus (Сообщение 291193)
Отдавайте данные на обработку серверу или используйте Web Workers
http://habrahabr.ru/post/132785/

Кажется вы хотели написать клиенту? Дело в том, что у меня все функции обрабатывает сервер на nodejs и вся игровая логика.

ksa 09.01.2014 13:13

Цитата:

Сообщение от Dorian_bs
Меня интересует вопрос, правильно ли я понимаю логику асинхронной работы?

Асинхронность в JS может породить только
setTimeout(); 
setInterval();


Цитата:

Сообщение от Dorian_bs
Возможно ли как то ускорить процесс?

Улучшать/Оптимизировать функцию расчета...

И помнить, что таймауты вещь ооочень относительная. :) При увеличении нагрузки на клиента они только возрастают. Т.е. твоя 1 - чистая фикция. Браузер будет запускать "потоки" когда сочтет это возможным...

melky 09.01.2014 14:03

для начала убрать eval

Dorian_bs 09.01.2014 15:48

ksa, спасибо!

melky, спасибо за совет! Просто мне показалось, что обработка evel'oм данной строки не будет так ресурсоемко, ибо мы не выполняем большую функцию, а всего лишь до 10 символов.
Или я не прав?

ksa 09.01.2014 15:52

Цитата:

Сообщение от Dorian_bs
мне показалось, что обработка evel'oм данной строки не будет так ресурсоемко

Тут eval() не в почете... :nono: За него и карму могут минусануть. :D

kobezzza 09.01.2014 15:58

Цитата:

Сообщение от ksa (Сообщение 291219)
Асинхронность в JS может породить только
setTimeout(); 
setInterval();

AJAX, setImmediate, webWorkers, postMessage и т.д.

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

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

Dorian_bs 09.01.2014 16:19

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

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

kobezzza 09.01.2014 16:28

Цитата:

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

Это либа в первую очередь для браузера, т.к. WebWorkers - это АПИ браузера для создания потоков, но у него голое АПИ не очень удобное, вот operative добавляет сахара.

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

Dorian_bs 09.01.2014 16:39

Цитата:

Сообщение от kobezzza (Сообщение 291275)
В Node.js для разгрузки циклов юзай nextTick и setImmediate.

То есть внутри функции operative использовать nextTick или setImmediate для дополнительной разгрузки??)

kobezzza 09.01.2014 16:41

Цитата:

Сообщение от Dorian_bs (Сообщение 291279)
То есть внутри функции operative использовать nextTick или setImmediate для дополнительной разгрузки??)

Блин, нет конечно. Не используй Operative в node.js, т.к. в ноде никак WebWorkers нет - это браузерное АПИ, а в ноде для этого свои механизмы существуют.

http://www.youtube.com/watch?v=q7KfO...ature=youtu.be

Dorian_bs 09.01.2014 16:47

kobezzza, понял:) Спасибо, буду продолжать изучение

Nodeveloper 02.02.2014 14:24

Скорее всего, ошибка заключается в самом алгоритеме рассчета.
К примеру, если погонять разные алгоритмы по разным лабиринтам на сайте http://qiao.github.io/PathFinding.js, то можно заметит, что большинство алгоритмов работает около 3 мс, кроме алгоритма дейкстры, который ищет путь за 10 мс.
То есть, даже если предположить, что путь ищется за 20 мс, такая задержка все равно будет незаметна для человека.

kostyanet 03.02.2014 11:03

Цитата:

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

Походу ваши зомби умны как Карл Маркс.

Что удалось узнать из скупой заметки про Node.js которая на 90 процентов состоит из истории чем вдохновлялся создатель, платформа - изначально асинхронная пушка. non-blocked I\O встроен, с чем вы похоже не разобрались.


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