Онлайн-игры или что-то быстрее, чем 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(с примерами), и я просто пропустил его.

Ответ 1

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

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

Ответ 2

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

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

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

источник

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

  • он открывает новое подключение к серверу apache
  • чем apache ищет php script и запускает его
  • теперь php script подключится к серверу для запроса и вернет результат.

но то, что делает websocket, это то, что устраняет два процесса соединения и просто отправляет сообщение на сервер. сервер уже подключен к серверу sql

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

Ответ 3

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

Но есть еще одна проблема, с которой вы могли столкнуться:

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

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

Ответ 4

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

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

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

Ответ 5

Попробуйте следующее: http://socket.io/

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

Ответ 6

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

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

Если вы не можете использовать веб-порты, что вполне может быть так, вы можете использовать длинный и короткий гибрид опроса (см. ниже). Использование очень длинных опросов не требуется и занимает слишком много ресурсов. После примерно 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);
}

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