Я делаю это как можно короче.
Что я сделал до сих пор: в игре у меня будет работать JavaScript с помощью setTimeout
или setInterval
. Это не вспышка или что-то особенное. То, что я сделал до тех пор, как тестовый прогон (так что вы можете понять лучше), довольно много цикла Ajax, чтобы как можно быстрее отправлять запросы на PHP-страницу, а затем PHP читает $_GET
в URL-адресе из запрос, затем PHP редактирует файл с именем p1.html с помощью $_GET
, который является просто координатами x и y-оси игрока. Таким образом, в браузере игрока 2 он в значительной степени сделал то, что я сказал выше, и теперь, когда он получает запрос Ajax, он получит координаты игрока 1. Таким образом, JavaScript делает то, что он делает, и перемещает игрока 1 на браузер игрока 2. Это то, что я уже сделал сам, и я тестировал его, и да, это работает, и да, это длится вечно, когда я исправлял все ошибки и прочее.
Говоря это, это то, что я сделал до сих пор, но это недостаточно быстро, если я хочу как онлайн-файтинг, так и прокрутку в реальном времени. Так вот с чем мне нужна помощь. Я знаю много вещей на w3schools.com, но я просто не знаю, как это сделать. Вероятно, это так. Мне просто нужен браузер 1, чтобы получить данные в браузере 2, что-то вроде этого «1,100,200» или немного больше на самом деле, и браузер 2 читал эти данные как переменную в JavaScript (что-то вроде x="received data";
) и это все. JavaScript сделает все остальное.
Я уверен, что могу программировать все, что мне нужно, но для отправки данных из точки A в точку B, как 50 раз в секунду, я просто ничего не знаю об этом. Даже не имя. И, наконец, URL-адреса и примеры были бы очень приятными (чтобы быть понятнее). Особенно, если он уже на w3schools.com (с примерами), и я просто пропустил его.
Ответ прост: используйте websockets . Они позволяют мгновенно нажимать данные в обоих направлениях для кажущихся мгновенными взаимодействиями. Они устраняют необходимость вытаскивать данные у клиента, который является медленным и тяжелым (в том числе для сервера). Обратите внимание, что это решение, используемое в моей любимой игре для уведомления.
Вам может быть интересно это введение в websockets на PHP . Но обратите внимание, что PHP на самом деле не является наиболее эффективным решением для длительной обработки соединений и игр в режиме реального времени (вы можете предпочесть Go, node.js, java и т. Д.).
вы можете использовать websocket
Преимущество использования WebSockets (по сравнению с AJAX) в основном заключается в том, что накладные расходы HTTP меньше. Как только соединение будет установлено, вся последующая передача сообщений будет выполняться через сокет, а не новые запросы HTTP-запроса / ответа. Таким образом, можно предположить, что WebSockets может отправлять и получать гораздо больше сообщений в единицу времени. Оказывается, это правда. Но есть очень горькая реальность, когда вы добавляете латентность в микс.
WebSockets примерно на 10-20% быстрее, чем AJAX
источник
что происходит, когда мы используем ajax с php
но то, что делает websocket, – это устранение 2 процессов соединения и просто отправьте сообщение на сервер. сервер уже подключен к серверу sql
Другим преимуществом является то, что соединение между клиентом и сервером остается открытым, сервер может отправлять сообщения клиенту. в ajax вам нужно каждый раз калибровать
Я согласен с другими плакатами: websockets – это технология, которую вы должны использовать. Единственным недостатком является то, что веб-порты не поддерживаются Internet Explorer до версии 10, которая в настоящее время доступна только для Windows 8 и не будет доступна для любой версии Windows до Windows 7. Если вы хотите поддерживать пользователей IE в Vista и XP , вам потребуется резервное копирование с AJAX или Flash.
Но есть еще одна проблема, с которой вы могли столкнуться:
для отправки данных из точки A в точку B, как 50 раз в секунду
Когда вам нужно часто отправлять данные, что-то кажется неправильным в вашем протоколе. Планируете ли вы обновлять позиции игроков с регулярными интервалами в 20 мс, даже если они не меняются (игрок стоит) или меняются с постоянной скоростью (игрок идет в одном направлении)? Я бы предложил вам не переносить позиции, а только изменения направления движения (начать движение влево, остановить движение влево на X: Y и т. Д.), Вы можете безопасно использовать большую полосу пропускания.
При правильной архитектуре длинные опросы аякс-запросов работают просто отлично для связи в режиме реального времени. При этом длительный опрос является скорее «взломом»; если вы ищете что-то построенное с желаемой связью в виду, вы должны быть определенными веб-узлами :
WebSockets – это передовая технология, позволяющая открывать интерактивный сеанс связи между браузером пользователя и сервером. С помощью этого API вы можете отправлять сообщения на сервер и получать ответы, управляемые событиями, без необходимости опроса сервера для ответа.
Посмотрите на браузерное приложение для вдохновения – прекрасные люди в Mozilla сделали весь исходный код доступным на github !
Попробуйте следующее: http://socket.io/
Он может делать websockets, длинный опрос, вспышки сокеты и многое другое! И они утверждают, что он поддерживает IE 5.5.
Websockets отличные и часто упоминались, но устройства Android и 16% браузеров не поддерживают веб-сайты ( CanIUse.com ). Многие серверные установки также не поддерживают веб-порты, включая общие настройки LAMP. Если у вас есть общий хост, или если вы хотите получить широкую поддержку, веб-сайты могут быть недействительными.
Длительный опрос является единственной действующей альтернативой веб-сайтам. Он имеет более широкую поддержку (он должен работать практически со всеми серверами и клиентами), но он имеет существенный недостаток на серверах, которые не обрабатывают много одновременных подключений, вроде Apache. Другим недостатком является то, что вы должны выполнять множество регулярных запросов к базе данных (вероятно, несколько раз в секунду) независимо от того, сколько пользователей подключено. Использование общей памяти, например, shm_attach()
в PHP, может облегчить эту нагрузку. Поскольку серверный скрипт контролирует новые сообщения, они немедленно отправляются через открытое соединение при его обнаружении. Клиент получит сообщение и перезапустит длительное соединение с новым запросом.
Если вы не можете использовать веб-узлы, что может быть так, вы можете использовать длинный и короткий гибрид опроса (см. Ниже). Использование очень длинных опросов не требуется и занимает слишком много ресурсов. После примерно 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); }
Короткий опрос уменьшает количество одновременных подключений, вместо этого используется повторный опрос (запрос). Как всегда, недостатком короткого опроса является задержка в получении новых сообщений. Однако это аналогично реальной жизни, поэтому это не должно быть большой проблемой. (Если кто-то не звонил вам на прошлой неделе, они вряд ли будут звонить вам в ближайшие пять минут, поэтому проверка вашего телефона каждые пять минут будет глупой.)