Как стать автором
Обновить

Комментарии 56

никто не комментирует, все играют?
НЛО прилетело и опубликовало эту надпись здесь
пока-что сервер не загружается больше чем на 40%. Бесконечная загрузка, может быть из-за того, что вы за прокси рубящей websocket траффик. я не знаю как потестить эту ситуацию, у меня то сервер под рукой. поэтому внятного сообщения об ошибке не могу пока сделать. Как вариант можно на странице websocket.org/echo.html проверить работу websocket. Хотя если тесты на websocket.org работают, это еще не значит что между моим сервером и вами нету такой прокси.
НЛО прилетело и опубликовало эту надпись здесь
я проверяю наличие вебсокетов. если их нет, то будет сообщение об этом. а вот если websocket есть, а подключиться через прокси не удается — то возможно бесконечно «подключение...» висеть будет.
НЛО прилетело и опубликовало эту надпись здесь
раз так, значит мое интернет подключение — узкое место.
занято…
Когда выбираю 2х2. Игра начинается, через 10 сек выкидывает в чат, потом снова сама начинается, и так без остановки
Оптимизировали, оптимизировали, да переоптимизировали.
Так вот откуда прирост, одновременного обслуживания :-)
Автор быстрее чините, завтра пятница
тут две причины: или вы начинаете игру когда еще не набралось игроков на две команды, то есть три и более игроков. или вы наткнулись на баг, о котором я еще не знаю. скорее всего первое.
сама игра стартовать не должна, возможно ее стартует другой игрок из этого же premade.
Увеличьте лимит! И да, прощай рабочий день ;)
лимит боюсь увеличивать, лучше уж сколько есть без тормозов поиграют (возможно без тормозов).
А что нибудь с распаралеливанием всего этого дела не думали?
пока нет
надо сделать чтобы вход в игру 2на2 был таким:
1 игрок — снизу
2 игрок — сверху
3 игрок — снизу
4 игрок — сверху

сейчас
1 — снизу
2 — снизу
3 — сверху
4 — сверху
как только доберусь до этого, сделаю чтобы можно было менять команду, пока игра не началась.
А какая версия node.js используется, если не секрет?

Ситуация с .forEach очень странная, думаю, можно оформить ее как баг v8 (Можно где-нибудь посмотреть код вашего сервера?). Строго говоря for ( ... in ...) должен приводить к деоптимизации всей функции, в которой он находится, так что странно, что все работало медленнее.

Если вы используете версию node.js 0.6.2 — пробовали запускать приложение с --trace-bailout, --trace-deopt флагами?
node — 0.4.12. Насчет флагов просвещусь. Но это не только v8, firefox также себя ведет.
«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 ).
НЛО прилетело и опубликовало эту надпись здесь
Как обычно, все зависит только от вашего кода, по-идее функция передаваемая в forEach должна инлайниться, и время выполнения будет практически таким же как при обычном цикле. Зато при использовании for (… in… ) вы гарантированно откажетесь от оптимизации всей функции, в которой он находится.
НЛО прилетело и опубликовало эту надпись здесь
Должна инлайниться — в данном случае, применимо только в компиляции (а если точнее — я имел в виду v8 ).

Я согласен с автором — в большинстве случаев все так и происходит, но в данной статье и конкретно в моем комментарии — речь только о node.js и v8.
НЛО прилетело и опубликовало эту надпись здесь
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 ).
Привет. Решил перечитать старые топы по ноде:) как писалось выше:
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 — желательно улучшить, чтобы было «не стыдно показать» простым пользователям, которым технические детали реализации самой игры глубоко до лампочки.

з.ы. максимум одновременных игр на сервере тоже маловат, ажиотаж создали — а поиграть не дали
Согласен по всем пунктам. Но сам я далек от дизайна. И realtime приложения совсем не мой конек. Вот втягиваюсь, так сказать. Думаю со временем все будет посимпатичнее.
Извините, но ваш браузер не поддерживает websocket. Рекомендуемые браузеры — Google Chrome версии 14 и выше, и Firefox версии 7 и выше.

Почему не работает в Safari на OS X Lion?

Более тупого определения WebSocket я не видел. Вы перебираете все браузеры на возможность в скрипте проверки? Не проще сделать что-то вроде этого:
if(typeof WebSocket == «undefined» || typeof MozWebSocket == «undefined») {alert(errMsg)}
Поменял User-Agent на Google Chrome под Windows XP — все заработало!!!
Ой, извини… Посмотрел!
В Safari typeof WebSocket возвращает «object».
Добавте тогда в релиз условие проверки!
спасибо за подсказку. тогда да, лучше проверять на undefined. исправлю.
Только у меня танчик не стреляет и не ездит, а только крутится? :(
несколько человек говорили об этом в чате. скажите какой у вас браузер и ось? может получится изловить багу.
FF 7.0.1
Ubuntu 11.10
Огромная просьба — повесьте танчики на 80й порт.
У многих посетителей (как, к примеру, у меня) этот порт закрыт на firewall'ах.
А ещё лучше — слушайте ещё и на 443м порту.
в планах, к сожалению времени мало на танчики.
Ну, прогресс уже есть :)
Поиграть смог, правда каждые 3-5 секунд все останавливается, потом бежит дальше.

Если хотите, могу разместить у себя на сервере, который всеравно простаивает (дц в москве, мощный вдс) — пишите, если интересно
в результате получаем около 25 байт [0,777,123,456,2,0,123,456]

Какой ужас. Разве нельзя никак передавать бинарные данные? Выигрыш был на порядок, без преувеличений
согласен, ужас. я пока не знаю, как передавать бинарные данные через socket.io.
Тынц и тынц гляньте, может пригодиться.
И еще вот такая связка может быть инетерсной. Сам только что на нее наткнулся, на первый взгляд под ваши нужды подходит.
github.com/cuzic/MessagePack-JS
github.com/pgriess/node-msgpack
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории