Онлайн-игры или что-то более быстрое, чем ajax для отправки/получения данных

я делаю это как можно короче.

что я сделал до сих пор: Игра, которую я буду работать с JavaScript, используя setTimeout или setInterval. Это не вспышка или что-то особенное. То, что я сделал до сих пор, как тестовый запуск (так что вы можете понять лучше), в значительной степени цикл Ajax, чтобы продолжать отправлять запросы на страницу PHP так быстро, как он может, который затем PHP читает $_GET в url из запроса, затем PHP редактирует файл с именем p1.html с $_GET, который просто игрок Координаты 1 по оси x и Y. Таким образом, в браузере игрока 2 он в значительной степени сделал то, что я сказал выше, и теперь, когда он получает запрос Ajax, он получит координаты игрока 1. Таким образом, JavaScript делает то, что он делает, и перемещает плеер 1 в браузере игрока 2. Это то, что я уже сделал сам, и я протестировал его, и да, он работает, и да, он длится вечно, когда я исправил все ошибки и прочее.

говоря это, это то, что я сделал до сих пор, но это недостаточно быстро, если я хотел, как онлайн-файтинг или игра с прокруткой в реальном времени. Вот с чем мне нужна помощь. Я знаю много вещей о w3schools.com но я просто не знаю, как получить эту работу. Наверное, это он. Мне просто нужен браузер 1, чтобы получить данные в браузер 2, что-то вроде этого "1,100,200" или немного дольше на самом деле, и браузер 2 прочитал эти данные как переменную в JavaScript (что-нибудь вроде x="received data";), и это просто. Остальное сделает JavaScript.

Я уверен, что могу запрограммировать все, что я мне нужно, но для отправки данных из точки А в точку Б, например, 50 раз в секунду, я просто ничего не знаю об этом. Даже имени. И, наконец, URL-адреса и примеры были бы очень приятными (чтобы быть более ясными). Особенно если он уже w3schools.com (с примерами) и я просто пропустил его.

6 ответов


ответ прост : используйте websockets. Они позволяют немедленно подталкивать данные в обоих направлениях для, казалось бы, мгновенных взаимодействий. Они устраняют необходимость вытягивания данных из клиента, который является медленным и тяжелым (в том числе для сервера). Обратите внимание, что это решение используется в моя любимая игра уведомления толчка.

вас может заинтересовать это введение в websockets на PHP. Но обратите внимание, что PHP действительно не наиболее эффективное решение для обработки длинных соединений и игр в реальном времени (вы можете предпочесть Go, node.js, java и т. д.).


можно использовать websocket

преимущество с WebSockets (над AJAX) в основном заключается в том, что меньше http-накладных расходов. После установления соединения все будущие сообщения передаются через сокет, а не через новые вызовы HTTP-запросов/ответов. Таким образом, вы предполагаете, что WebSockets может отправлять и получать гораздо больше сообщений в единицу времени. Оказывается, это правда. Но есть очень горькая реальность, как только вы добавляете латентность в микс.

WebSockets примерно на 10-20% быстрее, чем AJAX

источник

Что происходит, когда мы используем ajax с php

  1. он открывает новое соединение с сервером apache
  2. чем apache ищет PHP-скрипт и запускает его
  3. теперь PHP-скрипт подключится к серверу для запроса и вернет результат .

но то, что делает websocket, - это устранение 2 соединительных процессов и просто пошлю сообщение на сервер. сервер уже подключен к sql server

еще одним преимуществом является то, что соединение между клиентом и сервером остается открытым, сервер может отправлять сообщения клиенту. в ajax вам нужно cal каждый раз


Я согласен с другими плакатами: websockets-это технология, которую вы должны использовать. Единственным недостатком является то, что Websockets не поддерживаются Internet Explorer до версии 10, которая в настоящее время доступна только для Windows 8 и не будет доступна для любой версии Windows до Windows 7. Если вы хотите поддерживать пользователей IE на Vista и XP, вам нужен резервный вариант с AJAX или Flash.

но есть еще одна проблема вы можете столкнуться:

для отправки данные из точки A в точку B, как 50 раз в секунду

когда вам нужно часто отправлять данные, что-то кажется неправильным с вашим протоколом. Планируете ли вы обновлять позиции игроков через регулярные интервалы 20 мс, даже если они не изменились (игрок стоит) или меняются с постоянной скоростью (игрок идет в одном направлении)? Я бы предложил вам не переносить позиции, а только изменять направление движения (начать движение влево, остановить движение влево на X:Y и т. д.) таким образом, вы можете обеспечить большую пропускную способность.


при правильной архитектуре,опроса ajax запросы работают просто отлично для связи не в реальном времени. Это, как говорится, длинный опрос-это скорее "хак"; Если вы ищете что-то построен С желаемой связностью в виду, что Вы выбор должен быть websockets обязательно:

WebSockets-это передовая технология, которая позволяет открыть сеанс интерактивной связи между браузером пользователя и сервер. С помощью этого API можно отправлять сообщения на сервер и получать управляемые событиями ответы без необходимости опроса сервера для получения ответа.

проверить browserquest для вдохновения-прекрасный народ в Mozilla сделал весь свой исходный код доступным на github!


попробуйте это: http://socket.io/

Он может делать websockets, длинный опрос, флэш-сокеты и многое другое! И они утверждают, что он поддерживает IE 5.5.


Websockets велики и часто упоминались, но устройства Android и 16% браузеров не поддерживают websockets (CanIUse.com). Многие установки сервера также не поддерживают websockets, включая общие настройки лампы. Если у вас есть общий хост или вы хотите широкую поддержку, websockets может быть недопустимым вариантом.

опросов-это только альтернативу и WebSockets. Он имеет более широкую поддержку (он должен работать почти со всеми серверами и клиентами), но он имеет существенный недостаток на серверах, которые не обрабатывают много одновременных соединений хорошо-как Apache. Другой недостаток заключается в том, что приходится выполнять множество регулярных запросов к базе данных (вероятно, несколько в секунду) независимо от количества подключенных пользователей. Использование общей памяти, например shm_attach() в PHP, может облегчить эту нагрузку. Поскольку сценарий сервера отслеживает новые сообщения, они сразу же отправляются через открытое соединение при их обнаружении. Клиент получит сообщение, а затем перезапустите long связи с новым запросом.

Если вы не можете использовать websockets, что вполне может быть, вы можете использовать гибрид длинного и короткого опроса (см. ниже). Использование очень длинного опроса не нужно и занимает слишком много ресурсов. Примерно через 10 или 15 секунд постоянного соединения вы должны закрыть его и переключиться на старомодный короткий опрос, который является обычным запросом GET, который повторяется.

этот код jQuery непроверен, но вы получаете идея:

function longpoll(lastid) {
    /* Start recursive long polling. The server script must stay
    connected for the 15 seconds that the client waits for a response.
    This can be done with a `while()` loop in PHP. */

    console.log("Long polling started...");

    if (typeof lastid == 'undefined') {
        lastid = 0;
    }

    //long polling...
    setTimeout(function () {
        $.ajax({
            url: "stream.php?long=1&lastid=" + lastid, success: function (payload) {
                if (payload.status == "result") {
                    //result isn't an error. lastid is used as bookmark.
                    console.log("Long poll Msg: " + payload.lastid + ": " + payload.msg);
                    longpoll(lastid); //Call the next poll recursively
                } else if (payload.status == "error") {
                    console.log("Long poll error.");
                } else {
                    console.log("Long poll no results.");
                }

                /* Now, we haven't had a message in 15 seconds. Rather than 
                reconnect by calling poll() again, just start short polling 
                by repeatedly doing an normal AJAX GET request */

                shortpoll(lastid); //start short polling after 15 seconds

            }, dataType: "json"
        });            
    }, 15000); //keep connection open for 15 seconds
};

function shortpoll(lastid) {

    console.log("Short polling started.");

    //short polling...
    var delay = 500; //start with half-second intervals
    setInterval(function () {
        console.log("setinterval started.");
        $.ajax({
            url: "stream.php?long=0&lastid=" + lastid, success: function (payload) {
                if (payload.status == "result") {
                    console.log(payload.lastid + ": " + payload.msg);
                    longpoll(lastid); //Call the next poll recursively
                } else if (payload.status == "error") {
                    console.log("Short poll error.");
                } else {
                    console.log("Short poll. No result.");
                }
            }, dataType: "json"
        });
        delay = Math.min(delay + 10, 20000) //increment but don't go over 20 seconds    
    }, delay);
}

короткий опрос уменьшает количество параллельных подключений, используя вместо этого повторный опрос (запрос). Как всегда, недостатком короткого опроса является задержка получения новых сообщений. Однако это аналогично реальной жизни, поэтому это не должно быть большим делом. (Если кто-то не звонил вам на прошлой неделе, он вряд ли позвонит в ближайшие пять минут, поэтому проверять ваш телефон каждые пять минут было бы глупо.)