WebSocket'ы тормозят Unity 5 Unet[Решено]

Сеть в Unity3D

WebSocket'ы тормозят Unity 5 Unet[Решено]

Сообщение NeroXT 06 дек 2016, 21:15

Подключаюсь по стандартному network manager, так как работаю с физикой, каждый кадр отсылаю серверу управление(по Input.GetAxis) - по аттрибуту [Command], в ответ получаю скорости и позицию для сглаживания пермещения по аттрибуту [ClientRPC]. Дело в том, что на локальном сервере все ок, но на удаленном, выделенном - медленная прогрузка. При нажатии на кнопки управления, игрок реагирует через минуту или больше. Есть ли этому объяснение или это дело только в моем коде?
Последний раз редактировалось NeroXT 30 дек 2016, 11:50, всего редактировалось 1 раз.
Добавить kamalov.0_0 в Skype
Аватара пользователя
NeroXT
UNец
 
Сообщения: 34
Зарегистрирован: 16 сен 2013, 15:54
Откуда: Россия
Skype: kamalov.0_0

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение NeroXT 07 дек 2016, 17:49

Подключается к серверу, кстати, мгновенно.
Добавить kamalov.0_0 в Skype
Аватара пользователя
NeroXT
UNец
 
Сообщения: 34
Зарегистрирован: 16 сен 2013, 15:54
Откуда: Россия
Skype: kamalov.0_0

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение talion 09 дек 2016, 03:15

Может возникать проблема с тем, что перегружается буфер обмена, т.е. если вы каждую миллисекунду отправляете на удаленный сервер данные, то возникает очередь обработки, поэтому идет задержка. Например, сервер может обработать в единицу времени 100 сообщений, а вы ему за эту единицу времени отправляете 1000 сообщений - вот и задержка, например.
talion
UNITрон
 
Сообщения: 221
Зарегистрирован: 19 июн 2016, 20:43

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение NeroXT 09 дек 2016, 19:51

Спасибо за ответ, проверю.
Добавить kamalov.0_0 в Skype
Аватара пользователя
NeroXT
UNец
 
Сообщения: 34
Зарегистрирован: 16 сен 2013, 15:54
Откуда: Россия
Skype: kamalov.0_0

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение NeroXT 29 дек 2016, 14:54

Так и не поняв, я создал новый пустой проект, в котором создал шарик и придавал ему силу.
Изображение
Как видно на скрине, пинг начиная от 8(!!!) секунд и начинает расти. Использую по прежнему WebSocket'ы и стандартный Network Manager.
Добавить kamalov.0_0 в Skype
Аватара пользователя
NeroXT
UNец
 
Сообщения: 34
Зарегистрирован: 16 сен 2013, 15:54
Откуда: Россия
Skype: kamalov.0_0

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение talion 29 дек 2016, 15:46

NeroXT писал(а):Использую по прежнему WebSocket'ы и стандартный Network Manager.

Вы используете вебсокеты и юнет (который в стандарте в юнити)?
talion
UNITрон
 
Сообщения: 221
Зарегистрирован: 19 июн 2016, 20:43

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение NeroXT 30 дек 2016, 11:03

talion писал(а):
NeroXT писал(а):Использую по прежнему WebSocket'ы и стандартный Network Manager.

Вы используете вебсокеты и юнет (который в стандарте в юнити)?

Да, все стандартное.
Ping проверяю так: сервер отправляет вместе с позицией игрока время его отправления, на клиенте сверяю. Использую аттрибуты Command и ClientRpc.
Вот мой простой код:
Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class Player : NetworkBehaviour
{

        public float speed = 2;
        Transform look;
        NetworkIdentity view;
        Rigidbody rb;
        float inpX, inpY, oldF;
        double ping;
        // Use this for initialization
        void Start()
        {
                rb = GetComponent<Rigidbody>();
                view = GetComponent<NetworkIdentity>();
                look = GameObject.FindWithTag("MainCamera").transform;
                if (view.isLocalPlayer) tag = "Player";
                fps = GameObject.Find("FPS Text").GetComponent<Text>();
        }

        void Update()
        {
                if (view.isLocalPlayer)
                {
                        inpY = Input.GetAxis("Vertical");
                        inpX = Input.GetAxis("Horizontal");
                        CmdGetInputs(new Vector2(inpX, inpY), DateTime.UtcNow.ToFileTimeUtc());//отправляем управление серверу
                }
                //получаем позицию, скорость, повороты и время отправки
                if (view.isServer) RpcGetRB(transform.position, transform.eulerAngles, rb.velocity, rb.angularVelocity, DateTime.UtcNow.ToFileTimeUtc());
                if (Time.time - oldF > 0.5f || oldF == 0)
                {
                        oldF = Time.time;
                        fps.text = (int)(1 / Time.deltaTime) + " fps. " + Math.Round(ping, 5) + " ms.";
                }
        }
        // Update is called once per frame
        void FixedUpdate()
        {
                if (view.isServer)
                {
                        Vector3 v = rb.velocity;
                        rb.velocity = Vector3.forward * Time.deltaTime * 10 * speed * inpY
                                + Vector3.right * Time.deltaTime * 10 * speed * inpX;
                        rb.velocity = new Vector3(rb.velocity.x, v.y, rb.velocity.z);
                }
                else {
                        if (Vector3.Distance(transform.position, Pos) > 0.05f)
                                transform.Translate((Pos - transform.position).normalized * Time.deltaTime, Space.World);
                        if (Vector3.Distance(transform.eulerAngles, Rot) > 0.1f)
                                transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, Rot, Time.deltaTime);
                }
        }
        float ol;
        [Command]
        void CmdGetInputs(Vector2 inp, long time)
        {
                if (view.isLocalPlayer && view.isServer) return;
                inpX = inp.x;
                inpY = inp.y;
                if (ol == 0 || Time.time - ol > 1)
                {
                        ol = Time.time;
                        print("Ping: " + Math.Round((DateTime.UtcNow - DateTime.FromFileTimeUtc(time)).TotalMilliseconds));
                }
        }
        Vector3 Pos, Rot;
        Text fps;
        [ClientRpc]
        void RpcGetRB(Vector3 pos, Vector3 rot, Vector3 vel, Vector3 rotvel, long time)
        {
                if (view == null || rb == null || view.isServer) return;
                ping = Math.Round((DateTime.UtcNow - DateTime.FromFileTimeUtc(time)).TotalMilliseconds);
                Pos = pos;
                Rot = rot;
                rb.velocity = vel;
                rb.angularVelocity = rotvel;
        }
}
 

Скорость интернета у сервера варьируется от 400 мбит/с, если запустить все без сокетов на стендалон то пинг очень низок, то есть на локальном компьютере интернет тоже хороший.
Добавить kamalov.0_0 в Skype
Аватара пользователя
NeroXT
UNец
 
Сообщения: 34
Зарегистрирован: 16 сен 2013, 15:54
Откуда: Россия
Skype: kamalov.0_0

Re: WebSocket'ы тормозят Unity 5 Unet

Сообщение NeroXT 30 дек 2016, 11:49

Я немного понял.
Изменил параметры Max Delay на 0.1 и Max Buffered Packages на 4, После чего ping понизилcя до 1s, что в принципе и подсказало мне решение. Билд под Web делается долго, поэтому я не мог с чем-нибудь играться, но все-таки проблема решена.
Изображение
Добавить kamalov.0_0 в Skype
Аватара пользователя
NeroXT
UNец
 
Сообщения: 34
Зарегистрирован: 16 сен 2013, 15:54
Откуда: Россия
Skype: kamalov.0_0


Вернуться в Сеть

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2