Вычисляем пинг и ближайшее облако

Вычисляем пинг и ближайшее облако

Сообщение nikotin 28 июн 2018, 17:42

Здравствуйте. Чтоб создать хороший рилтайм необходимо знать пинг. Есть метод PhotonNetwork.GetPing() который возвращает RoundTripTime (если я верно перевел текст - время от клиента до сервера и обратно).
Скрытый текст:
Time until a reliable command is acknowledged by the server. The value measures
network latency and for UDP it includes the server's ACK-delay (setting in config).
In TCP, there is no ACK-delay, so the value is slightly lower (if you use default
settings for Photon). RoundTripTime is updated constantly. Every reliable command
will contribute a fraction to this value. This is also the approximate time until
a raised event reaches another client or until an operation result is available.

Написано что RoundTripTime постоянно обновляется (RoundTripTime is updated constantly), означает ли это что посылаются пакеты даже тогда, когда клиент не чего не посылает?
Я тестировал это так -в методе Awake коннектимся к серверу
Синтаксис:
Используется csharp
PhotonNetwork.ConnectUsingSettings(_gameVersion);
// странно -но метод ConnectToBestCloudServer не находит ближайшее облако -пинг больше чем в ручных настройках -
//  PhotonNetwork.ConnectToBestCloudServer(_gameVersion);

Создаем кнопку и в onclick добавляем публичный метод
Синтаксис:
Используется csharp
 public int npingn;
        public void Npingn()
        {
            npingn = PhotonNetwork.GetPing();
        }

И выводим где нужно инфу , например в рендере
Синтаксис:
Используется csharp
  public Text textn;
        void Update()
        {
            textn.text = "nping" + npingn;
           
        }

Не понятно почему если в настройках фотона (Window/Photon Unity Networking/Highlight Photon Server Settings)) поменять Udp на Tcp то пинг становится значительно меньше (на 10-20 мс), а по идее должно быть наоборот. Понятно что ASK delay учитывается в юдп (network latency and for UDP it includes the server's ACK-delay (setting in config).In TCP, there is no ACK-delay, so the value is slightly lower (if you use default settings for Photon)), но разве пинг по протоколу юдп не должен быть в 2 раза меньше чем TCP?
nikotin
UNец
 
Сообщения: 41
Зарегистрирован: 01 окт 2017, 15:44

Re: Вычисляем пинг и ближайшее облако

Сообщение seaman 28 июн 2018, 19:03

Если у них натуральный пинг, а не его эмуляция через UDP/TCP, так он использует протокол ICMP.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Вычисляем пинг и ближайшее облако

Сообщение nikotin 30 июн 2018, 12:02

Решил сделать эмуляцию пинга через UDP/TCP но не получилось. Сначала коннектимся
Синтаксис:
Используется csharp
 
 PhotonNetwork.autoJoinLobby = false;
PhotonNetwork.automaticallySyncScene = true;
PhotonNetwork.ConnectUsingSettings(_gameVersion);

Потом создаем обычную комнату при нажатие на кнопку например
Синтаксис:
Используется csharp
PhotonNetwork.CreateRoom(null, new RoomOptions() { MaxPlayers = 4 }, null);
...
public override void OnJoinedRoom()
        {
        PhotonNetwork.LoadLevel("Room for 1");
     }
 

В методе старт следующей сцены инстантиэйтим префаб с компонентом photonView
public GameObject prefabn;
Синтаксис:
Используется csharp
   void Start()
        {
PhotonNetwork.Instantiate(this.prefabn.name, new Vector3(0f, 5f, 0f), Quaternion.identity,0);
        }
            }  
        }

И уже в скрипте этого прифаба отправляем сообщение через RPC
Синтаксис:
Используется csharp
        void Update()
        {
            if (photonView.isMine == false && PhotonNetwork.connected == true)
            {
                return;
            }
            if (!Input.anyKey) return;
 if (Input.GetKeyDown(KeyCode.S))photonView.RPC("ChatMessagen", PhotonTargets.AllViaServer, Time.time);
        }
        public Text textn; private float timen;
        [PunRPC]
        void ChatMessagen(float timen, PhotonMessageInfo info)
        {
            this.timen = Time.time - timen; textn.text = "ping in ms;" + 1000*this.timen /*PhotonNetwork.GetPing()*/;
            Debug.Log(string.Format("Info: {0} {1} {2}", info.sender, info.photonView, info.timestamp));
        }
 

Еще можно кнопку сделать чтоб сверять эмуляцию пинга с PhotonNetwork.GetPing(). Получается что мое время на 20-90мс всегда больше чем PhotonNetwork.GetPing(). Скажите пожалуйста, так и должно быть, или где то у меня не нужные тормоза работают ?
nikotin
UNец
 
Сообщения: 41
Зарегистрирован: 01 окт 2017, 15:44

Re: Вычисляем пинг и ближайшее облако

Сообщение nikotin 01 июл 2018, 09:17

Просто раньше пробовал делать онлайн на java.nio (без юнити в консоле и на андроид), и арендовал vps в Москве . От меня до Москвы 1750 км и пинг в командной строке (команда ping адрес) показывал 33, а сообщение от клиента к vps и обратно приходило за 31 мс и ни каких задержек не было даже когда отправлял пакеты по 1024 byte. А тут какой то ACK-delay, с чем он связан - с тем что на сервере обслуживающем облако много других игр работает?
nikotin
UNец
 
Сообщения: 41
Зарегистрирован: 01 окт 2017, 15:44

Re: Вычисляем пинг и ближайшее облако

Сообщение nikotin 05 июл 2018, 09:25

Похоже RaiseEvent быстрее работает чем RPC
nikotin
UNец
 
Сообщения: 41
Зарегистрирован: 01 окт 2017, 15:44

Re: Вычисляем пинг и ближайшее облако

Сообщение IDoNotExist 05 июл 2018, 11:04

nikotin писал(а):но разве пинг по протоколу юдп не должен быть в 2 раза меньше чем TCP?

Про какой UDP ты говоришь? Если Reliable, то он тебе ничего не должен, так как там почти аналогичные TCP алгоритмы. Если ты говоришь про Unreliable, то для него измерять пинг нафиг не надо, ибо тебе должно быть пофиг когда пакет там дойдёт и дойдёт ли вообще (да конечно, ты можешь вбить в пакет Timestamp отправки с клиента и считать его на сервере, если время синхронизировано, но это уже будет не пинг, а тупо latency тобишь задержка).

Пошли далее: ACK - это acknowledgment, то есть подтверждение доставки пакета, он используется как в TCP так и в Reliable UDP, но как тебе написали в TCP он по умолчанию отключен (In TCP, there is no ACK-delay, so the value is slightly lower (if you use defaultsettings for Photon)), а в UDP включен (UDP it includes the server's ACK-delay (setting in config)), следовательно отключи его нафиг в настройках UDP и будет тебе счастье. Но учти, что он там не просто так включен, в UDP использовать ACK в некоторых ситуациях выгодно, ибо если ты редко используешь Reliable канал, сервер не сможет определить потерю пакета, пока к нему не придёт следующий пакет, а если и он потеряется, то пиши пропало.

Вот тебе простой пример, есть персонаж который бегает и стреляет, движение можно синхронизировать через Unreliable UDP, а стрельбу уже надо синхронизировать через Reliable UDP, допустим стреляет он с задержкой в 5 секунд, первый пакет с выстрелом не доходит до сервера, и у тебя отключен ACK, всё, сервер до следующего пакета не узнает что он выстрелил, опять же если следующий пакет успешно дойдёт до сервера.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist


Вернуться в Photon

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 0