Страница 1 из 1

Оптимизация скорости

СообщениеДобавлено: 16 июл 2012, 16:01
Phobius
Игра гонки. Пытаюсь синхронизировать две машины с помощью PUN RPC. Машинки постоянно дергаются и отстают от их реального местоположения. Через некоторое короткое время клиенты вылетают в PeerCreated.

Синтаксис:
Используется csharp
// отправка RPC
void Update()
    {
        float accel = Input.GetAxis("Vertical");
        float steer = Input.GetAxis("Horizontal");
        Cars[id].pcc.Accel = accel;
        Cars[id].pcc.Steer = steer;
        photonView.RPC("SetCarPosition", PhotonTargets.Others, Cars[id].car.transform.position, Cars[id].car.transform.rotation, accel, steer, id);
     }

void SetCarPosition(Vector3 position, Quaternion rotation, float accel, float steer, int id)
    {
        // pcc - скрипт управления машиной
        Cars[id].car.transform.position = position;
        Cars[id].car.transform.rotation = rotation;
        Cars[id].pcc.Accel = accel;
        Cars[id].pcc.Steer = steer;
    }
 


Боюсь представить что будет, если машин будет больше. Направьте на путь истинный))

Re: Оптимизация скорости

СообщениеДобавлено: 16 июл 2012, 16:06
gnoblin
1) каждый кадр отправлять рпц это плохо (раз 10-20/сек максимум)
2) в PUN рпц по-умолчанию reliable, поэтому не подходят для частой рассылки постоянно устаревающих данных - надо либо использовать state sync для этих целей, либо немного допилить PUN чтобы он мог рассылать как reliable так и unreliable rpc (что фотон сам по себе, конечно, умеет)

вылетают скорее всего потому что на сервер идет слишком (нереально) много данных и он кикает игроков

Re: Оптимизация скорости

СообщениеДобавлено: 16 июл 2012, 17:46
DeHHu
Может проще сглаживать движение Lerp"ом ?

Синтаксис:
Используется csharp
 
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(PhotonView))]
public class PersonNetwork : Photon.MonoBehaviour
{
    public Vector3 correctPlayerPos = Vector3.zero; //We lerp towards this
    public Quaternion correctPlayerRot = Quaternion.identity; //We lerp towards this
       
    void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {

            //We own this player: send the others our data
            stream.SendNext(transform.position);
            stream.SendNext(transform.rotation);
        }
        else
        {

            //Network player, receive data
            correctPlayerPos = (Vector3)stream.ReceiveNext();
            correctPlayerRot = (Quaternion)stream.ReceiveNext();


        }
    }


    void Update()
    {
        if (!photonView.isMine)
        {
            //Update remote player (smooth this, this looks good, at the cost of some accuracy)
            transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 5);
            transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 5);
        }
    }

}

Re: Оптимизация скорости

СообщениеДобавлено: 16 июл 2012, 21:44
Phobius
State sync с Lerp-ом работают весьма неплохо. Правда когда машинка у игрока-владельца останавливается, то у других игроков она потихоньку "ползет" к положенному месту. Я так понимаю что нужно регулировать время растяжения Lerp-а в зависимости от разницы предыдущей позиции и новой.

Нашел как формируется RPC в PUN, но вот в чистом фотоне мне не разобраться с ходу, т.к. не юзал.

Буду признателен если подкинете ссылок где можно посмотреть более сложные алгоритмы чем просто Lerp для повышения плавности хода.

P.S. Если я правильно понимаю, то Reliable от Unreliable должны отличается только логикой обработки, а именно отбрасываются ли "опоздавшие" пакеты или нет. А вот почему Unreliable не сжимается мне не понятно.

Re: Оптимизация скорости

СообщениеДобавлено: 17 июл 2012, 10:49
gnoblin
Phobius писал(а):А вот почему Unreliable не сжимается мне не понятно.

?

Re: Оптимизация скорости

СообщениеДобавлено: 17 июл 2012, 14:25
Phobius
gnoblin писал(а):
Phobius писал(а):А вот почему Unreliable не сжимается мне не понятно.

?


Пардон, перечитал статью еще раз и понял что же такое Delta Compression.