Интересует с помощью каких технологий достигается максимально низкий отклик для многопользовательских игр в веб-браузере? Какую например базу данных использовать? SQLite хороший вариант? В плане языка интересует больше php(хотя, я понимаю он далеко не самый быстрый для cgi), но с удовольствием послушаю другие варианты. И есть какие-нибудь интересные статьи по этому вопросу?
1 Answers
Тут не так в БД проблема, для максимально быстрого отклика используются сокеты...
Именно для игр - рекомендую java или nodejs ( сам выбрал бы последнее ибо выиграш в скорости разработки несмотря на "риск" использования новой технологии )
Сам недавно сильно заинтересовался подобными вопросами, одно я понял ( понимал правда и раньше :) ) наверняка - не так важна БД, важен сервер ( всмысле серверный код )...
По поводу php - в этом случае действительно ИМХО мягко говоря не лучший вариант...
UPD
Небольшой пример клиента и сервера с использованием nodejs + socket.io
Логично что для того чтобы все это работало необходимо установить nodejs + скачать socket.io, в этом всем желающим поможет гугл, я же просто приведу пример...
Сервер
/*
* require это подключение, у меня на linux'e установка socket.io происходит
* прямо из дистрибутива, если вы просто скачали библиотеку то надо указать
* к ней полный путь
*/
var io = require('socket.io').listen(8010, '127.0.0.1');
// тут грубо говоря мы пишем - пускай будет веб сокет сервак
// на 8010 порте и c IP 127.0.0.1
// Навешиваем обработчик на подключение клиента
io.sockets.on('connection', function (socket) {
// функция переданная в обработчик инициализирует
// конкретный экземпляр сокета - socket
// теперь мы с ним законно можем работать
// ну и чтобы внести хоть какойто смысл в это все
// сделаем вывод сообщений отправленых клиентом
// в консольку...
socket.on('message', function (msg) {
console.log(msg);
});
socket.on('disconnect', function() {
console.log("User disconnected");
});
});
Клиент
Для начала нам необходимо подключить скрипт которы и будет работать над подключением и разруливание проблем кроссбраузерности, т.е. если браузер поддерживает WebSocket - использоваться будут именно они, если же нет то пробует создать xhr, long puling и т.д. и т.п. Впринцыпе вам не нужно особо вникать что да как, достаточно просто создать подключение...
Делается это так
<script src="http://127.0.0.1:8010/socket.io/socket.io.js"></script>
Думаю тут все понятно...
Ну и наш "основной" скрипт...
var socket; // ну собственно переменная для сокета
var msg=0; // счетчик отправленных серверу сообщений
onload = function() {
socket = io.connect('http://127.0.0.1:8010'); // конектимся
//ну а тут вешаем обработчик на подключение...
socket.on('connect', function () {
setInterval("socket.send('Какоето сообщение - ' + msg); msg++;", 1000);
//ну и с интервалом в секунду кидаем cерверу текст и инкриментим наш счетчик...
});
};
Ну собственно все теперь осталось запустить наш сервер и смотреть результат :)
Как видите все парадоксально просто...
PS: после того как написал первый раз нечто подобное сразу же влюбился в nodejs ^^
PPS: тестил в мазиле, опере, хрониуме, хроме - проблем обнаружено не было, если у браузера нет реализации WebSocket используются пляски с бубном в клиентском скрипте server.io, возможно даже в IE сработало бы (хотя если вопрос об игре, не думаю что тут есть смысл хоть как-то пытаться писать клиента под IE)
UPD2
Вики socket.io
Офф сайт
Кстати читал о событиях и тому подобном не в вики, но тот сайт где я тогда читал навсегда забыт на 10+ страницах гугла :)
PS:сокеты полноценны и позволяют намного большее чем просто отправлять какой-то текст и выводить в консоль, но это, те кому интересно, и так, вскоре, узнают сами :)
-
Простите за невежество, а сокеты, это Unix-сокеты, или нечто в низкоуровневом программировании? Еще вспоминается что вроде комбинация порт и ip-адрес сокетом называется. – culebre Oct 27 '11 at 13:50
-
3да нет это способ передачи данных, идея в том что клиент открывает соедениние с сервером и оно уже не закрывается ( соответственно нет необходимости в ajax'e ). Кстати по поводу аякса - однозначно не вариант, во первых все время передаем лишнюю инфу, во вторых нет четкой связи клиента с сервером...
Вообще идея сокетов примерно такая - привет сервер, привет клиент, ну все погнали... Потом клиент может отправлять любые данные и сервер соответственно, причем сервер может отправлять данные, например изза действий других игроков, что при использовании ajax'a было бы невозможно... – Oct 27 '11 at 13:59 -
Кстати в написании веб сокет сервера нет вообще ничего сложного, я вас уверяю...
Есть набор событий, вам (грубо говоря) просто нужно написать ихобработку... Опять тки это астрактно написано, веб сокет сервера могут быть ооочень сложными, хотя, в тоже время, парадоксально простыми.
Вообщем боятся их ожнозначно не нужно, ничего сложного в них нет – Oct 27 '11 at 14:01 -
И реализовать это можно, я так понимаю, на nodejs. А клиентская сторона в виде браузера как это все принимает в виде post запросов? – culebre Oct 27 '11 at 14:05
-
не совсем, собственно просто погуглите в сторону socket.io, все очень и очень просто... Сейчас напишу простой пример для клиента и сервера – Oct 27 '11 at 14:12
-
@AlexWindHope ! Про веб сокет очень интересно. Если правильно понял, можно написать клиента под браузером, который по TCP сокету общается с сервером ? Надеюсь это не Java апплет ?
Если можно поподробнее (язык, библиотека, как загружается в браузер и т.п.)
– avp Oct 27 '11 at 14:26 -
вот вам пример реализации nodejs + socket.io...
Никаких аплетов естественно нет :) – Oct 27 '11 at 14:31 -
Отлично. Надеюсь socket.on('receive', function () { или что-то для асинхронного чтения существует.
Т.е. это выглядит, как нормальные сокеты, сервер можно писать на чем угодно.
Ссылочку на доку опубликуйте, плиз.
– avp Oct 27 '11 at 14:39 -
СПАСИБО !!! Теперь, если это в самом деле работает, совсем другое программирование пойдет ! – avp Oct 27 '11 at 14:52
-
Естественно хранить инфу в оперативке можно и нужно, но делать это надо с умом и еще раз повторюсь - это вас никак не избавляет от необходимости как-то хранить состояние сервера... – Oct 27 '11 at 13:44