Comments 56
никто не комментирует, все играют?
UFO just landed and posted this here
пока-что сервер не загружается больше чем на 40%. Бесконечная загрузка, может быть из-за того, что вы за прокси рубящей websocket траффик. я не знаю как потестить эту ситуацию, у меня то сервер под рукой. поэтому внятного сообщения об ошибке не могу пока сделать. Как вариант можно на странице websocket.org/echo.html проверить работу websocket. Хотя если тесты на websocket.org работают, это еще не значит что между моим сервером и вами нету такой прокси.
занято…
Когда выбираю 2х2. Игра начинается, через 10 сек выкидывает в чат, потом снова сама начинается, и так без остановки
Оптимизировали, оптимизировали, да переоптимизировали.
тут две причины: или вы начинаете игру когда еще не набралось игроков на две команды, то есть три и более игроков. или вы наткнулись на баг, о котором я еще не знаю. скорее всего первое.
сама игра стартовать не должна, возможно ее стартует другой игрок из этого же premade.
Увеличьте лимит! И да, прощай рабочий день ;)
А что нибудь с распаралеливанием всего этого дела не думали?
А какая версия node.js используется, если не секрет?
Ситуация с .forEach очень странная, думаю, можно оформить ее как баг v8 (Можно где-нибудь посмотреть код вашего сервера?). Строго говоря
Если вы используете версию node.js 0.6.2 — пробовали запускать приложение с
Ситуация с .forEach очень странная, думаю, можно оформить ее как баг v8 (Можно где-нибудь посмотреть код вашего сервера?). Строго говоря
for ( ... in ...)
должен приводить к деоптимизации всей функции, в которой он находится, так что странно, что все работало медленнее.Если вы используете версию node.js 0.6.2 — пробовали запускать приложение с
--trace-bailout
, --trace-deopt
флагами?node — 0.4.12. Насчет флагов просвещусь. Но это не только v8, firefox также себя ведет.
«for (… in ...) должен приводить к деоптимизации всей функции» очень интересно понять, о чем вы говорите :) можете поделиться ссылками, где можно прочитать про внутренности v8?
«for (… in ...) должен приводить к деоптимизации всей функции» очень интересно понять, о чем вы говорите :) можете поделиться ссылками, где можно прочитать про внутренности v8?
Вот тут: github.com/v8/v8/blob/master/src/hydrogen.cc
:)
Если в кратце, то bailout означает, что функция не может и не будет соптимизирована в виду ее каких-то особенностей (как, например, for (… in ...): github.com/v8/v8/blob/master/src/hydrogen.cc#L3071 ).
:)
Если в кратце, то bailout означает, что функция не может и не будет соптимизирована в виду ее каких-то особенностей (как, например, for (… in ...): github.com/v8/v8/blob/master/src/hydrogen.cc#L3071 ).
UFO just landed and posted this here
Как обычно, все зависит только от вашего кода, по-идее функция передаваемая в forEach должна инлайниться, и время выполнения будет практически таким же как при обычном цикле. Зато при использовании for (… in… ) вы гарантированно откажетесь от оптимизации всей функции, в которой он находится.
UFO just landed and posted this here
Должна инлайниться — в данном случае, применимо только в компиляции (а если точнее — я имел в виду v8 ).
Я согласен с автором — в большинстве случаев все так и происходит, но в данной статье и конкретно в моем комментарии — речь только о node.js и v8.
Я согласен с автором — в большинстве случаев все так и происходит, но в данной статье и конкретно в моем комментарии — речь только о node.js и v8.
UFO just landed and posted this here
forEach() в первой версии использовался и на сервере и на клиенте. браузеры тоже сильно тормозили тогда. поэтому forEach() -> for(var i in ...) — это оказалась и серверная и клиентская оптимизация. так как node.js и chrome используют один js движок, то тесты в chrome так же относятся к node.js. Хотя судя по словам donnerjack13589 — это может быть просто бага и в будущем будет лучше вернуть все на forEach().
Это не бага, просто массив это структура, в которой численные ключи генерируются из порядкового номера значения. Когда вы записываете значение по ключу и используете его вроде как хеш, но не массив, вы и приводите к таким ситуациям. Это кстати свойственно не только JavaScript. А суть вся скорее всего в том, что внутри forEach() (который создан для обхода массивов, а значит 0..n) логика завязана на length, а как всем известно:
var a = [];
a[10000000] = 1;
a.length; // 10000001
ну да, но ведь в javascript вроде как все объекты — хеш-таблицы, в том числе Array. и for(var i in ) хорошо справляется с любыми индексами, почему бы forEach() не работать так же? Тем более forEach в Опере с этим справляется.
Хотя если подумать, там где я использую Array, как разреженный массив, можно просто использовать Object. Но тогда из вариантов обхода у меня остается только вариант с for(var i in ).
Хотя если подумать, там где я использую Array, как разреженный массив, можно просто использовать Object. Но тогда из вариантов обхода у меня остается только вариант с for(var i in ).
Привет. Решил перечитать старые топы по ноде:) как писалось выше:
Смотрим спецификацию как должен работать forEach и как оно выглядит в коде, эмуляция от мозилы.
Итого, вас будет 1000000 раз в цикле проверено наличие свойства у массива по индексу в цикле и два раза вызван калбэк. Все по спецификации. Просто у вас массивы такие:)
Если есть желание перебирать такие массивы в функциональной форме через for(… in ...) — пожалуйста, дополните прототип Array чем-то типа:
Получаем:
Правда если писать в прототип так, а не через defineProperty с enumerable:false, а оно в старых ie недоступно, проблематично будет просто for(… in ...) использовать:)
var a=[]
a[10]=1
a//=>[undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 1]
Смотрим спецификацию как должен работать forEach и как оно выглядит в коде, эмуляция от мозилы.
a.hasOwnProperty(10)//=>true
a.hasOwnProperty(9) //=>false
Итого, вас будет 1000000 раз в цикле проверено наличие свойства у массива по индексу в цикле и два раза вызван калбэк. Все по спецификации. Просто у вас массивы такие:)
Если есть желание перебирать такие массивы в функциональной форме через for(… in ...) — пожалуйста, дополните прототип Array чем-то типа:
Array.prototype.forIn=function(cb,cont){
for(var i in this)
if(this.hasOwnProperty(i))cb.call(cont||this,this[i]);}
Получаем:
a=[1];
a[1000000]=1;
console.time('qwe');
a.forEach(function(i){console.log(i);})
console.timeEnd('qwe'); //=>404ms
console.time('asd');
a.forIn(console.log,console);
console.timeEnd('asd'); //=>1ms
Правда если писать в прототип так, а не через defineProperty с enumerable:false, а оно в старых ie недоступно, проблематично будет просто for(… in ...) использовать:)
Поиграл, но с большим трудом (тормозит слишком), хотя причиной может быть плохое соединение на рабочем месте.
Автор молодец.
Автор молодец.
Так может кто-нибудь выделит место на сервере с широким каналом под игру? Чтобы больше играющих было.
Автору уважение и почёт за воплощение детской мечты! Танчики с мультиплеером по сети! Играть очень весело!
Автору уважение и почёт за воплощение детской мечты! Танчики с мультиплеером по сети! Играть очень весело!
UI вас очень подкачал. После ввода ника (тут всё понятно), редиректит на отчаянно криво-косо свёрстанную страничку чата с нечитаемыми никами в левом столбце (из-за горизонтальных скроллов). И совсем не сразу понятно, что возможность поиграть прячется в правом верхнем углу. Дизайн, вёрстка, UI — желательно улучшить, чтобы было «не стыдно показать» простым пользователям, которым технические детали реализации самой игры глубоко до лампочки.
з.ы. максимум одновременных игр на сервере тоже маловат, ажиотаж создали — а поиграть не дали
з.ы. максимум одновременных игр на сервере тоже маловат, ажиотаж создали — а поиграть не дали
Извините, но ваш браузер не поддерживает websocket. Рекомендуемые браузеры — Google Chrome версии 14 и выше, и Firefox версии 7 и выше.
Почему не работает в Safari на OS X Lion?
Более тупого определения WebSocket я не видел. Вы перебираете все браузеры на возможность в скрипте проверки? Не проще сделать что-то вроде этого:
if(typeof WebSocket == «undefined» || typeof MozWebSocket == «undefined») {alert(errMsg)}
Почему не работает в Safari на OS X Lion?
Более тупого определения WebSocket я не видел. Вы перебираете все браузеры на возможность в скрипте проверки? Не проще сделать что-то вроде этого:
if(typeof WebSocket == «undefined» || typeof MozWebSocket == «undefined») {alert(errMsg)}
Супер!
а вы хоть видели как я проверяю наличие WebSocket?
смотрите как это тупо — code.google.com/p/battle-city-js/source/browse/src/client.js#84 :)
смотрите как это тупо — code.google.com/p/battle-city-js/source/browse/src/client.js#84 :)
Только у меня танчик не стреляет и не ездит, а только крутится? :(
Огромная просьба — повесьте танчики на 80й порт.
У многих посетителей (как, к примеру, у меня) этот порт закрыт на firewall'ах.
А ещё лучше — слушайте ещё и на 443м порту.
У многих посетителей (как, к примеру, у меня) этот порт закрыт на firewall'ах.
А ещё лучше — слушайте ещё и на 443м порту.
Ну, прогресс уже есть :)
Поиграть смог, правда каждые 3-5 секунд все останавливается, потом бежит дальше.
Если хотите, могу разместить у себя на сервере, который всеравно простаивает (дц в москве, мощный вдс) — пишите, если интересно
Поиграть смог, правда каждые 3-5 секунд все останавливается, потом бежит дальше.
Если хотите, могу разместить у себя на сервере, который всеравно простаивает (дц в москве, мощный вдс) — пишите, если интересно
в результате получаем около 25 байт [0,777,123,456,2,0,123,456]
Какой ужас. Разве нельзя никак передавать бинарные данные? Выигрыш был на порядок, без преувеличений
согласен, ужас. я пока не знаю, как передавать бинарные данные через socket.io.
Или github.com/sirikata/protojs, но он как-то монструозен, имхо.
И еще вот такая связка может быть инетерсной. Сам только что на нее наткнулся, на первый взгляд под ваши нужды подходит.
github.com/cuzic/MessagePack-JS
github.com/pgriess/node-msgpack
github.com/cuzic/MessagePack-JS
github.com/pgriess/node-msgpack
open source?
Sign up to leave a comment.
Танчики на node.js — оптимизация