Pull to refresh

Comments 56

никто не комментирует, все играют?
UFO just landed and posted this here
пока-что сервер не загружается больше чем на 40%. Бесконечная загрузка, может быть из-за того, что вы за прокси рубящей websocket траффик. я не знаю как потестить эту ситуацию, у меня то сервер под рукой. поэтому внятного сообщения об ошибке не могу пока сделать. Как вариант можно на странице websocket.org/echo.html проверить работу websocket. Хотя если тесты на websocket.org работают, это еще не значит что между моим сервером и вами нету такой прокси.
UFO just landed and posted this here
я проверяю наличие вебсокетов. если их нет, то будет сообщение об этом. а вот если websocket есть, а подключиться через прокси не удается — то возможно бесконечно «подключение...» висеть будет.
UFO just landed and posted this here
раз так, значит мое интернет подключение — узкое место.
Когда выбираю 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?
UFO just landed and posted this here
Как обычно, все зависит только от вашего кода, по-идее функция передаваемая в forEach должна инлайниться, и время выполнения будет практически таким же как при обычном цикле. Зато при использовании for (… in… ) вы гарантированно откажетесь от оптимизации всей функции, в которой он находится.
UFO just landed and posted this here
Должна инлайниться — в данном случае, применимо только в компиляции (а если точнее — я имел в виду 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 ).
Привет. Решил перечитать старые топы по ноде:) как писалось выше:
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. исправлю.
Только у меня танчик не стреляет и не ездит, а только крутится? :(
несколько человек говорили об этом в чате. скажите какой у вас браузер и ось? может получится изловить багу.
Огромная просьба — повесьте танчики на 80й порт.
У многих посетителей (как, к примеру, у меня) этот порт закрыт на firewall'ах.
А ещё лучше — слушайте ещё и на 443м порту.
в планах, к сожалению времени мало на танчики.
Ну, прогресс уже есть :)
Поиграть смог, правда каждые 3-5 секунд все останавливается, потом бежит дальше.

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

Какой ужас. Разве нельзя никак передавать бинарные данные? Выигрыш был на порядок, без преувеличений
согласен, ужас. я пока не знаю, как передавать бинарные данные через socket.io.
UFO just landed and posted this here
Sign up to leave a comment.

Articles