Unity
포톤 실시간 동기화 방식 Synchronization Issues [Unity]
Tennessee201
2022. 11. 2. 17:53
728x90
포톤을 통하여 각 사용자의 화면간에 동기화를 진행해줄때는 다양한 방법이 있다.
기본적으로 Application은 포톤서버와 각각 통신한다. 이 과정에서 두 플레이어(클라이언트) 간 RTT의 합계가 필요하다 .
네트워크적으로 깊은개념을 제쳐두고 우선 결과만 본다면 1초정도의 지연이 발생한다고 한다.
아래는 포톤 공식홈페이지에서 제안하는 클라이언트 간 동기화 속도 개선방법
기본적으로 포톤에서 패킷은 1초에 10번을 전송한다. 그렇기 때문에 포톤에서 값을 받아온 후, 클라이언트에서 해당 값을 보정해주어야 한다.
using UnityEngine;
public class Ball : Photon.MonoBehaviour, IPunObservable {
Vector3 _networkPosition;
Quaternion _networkRotation;
Rigidbody _rb;
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
stream.SendNext(_rb.position);
stream.SendNext(_rb.rotation);
stream.SendNext(_rb.velocity);
}
else
{
_networkPosition = (Vector3)stream.ReceiveNext();
_networkRotation = (Quaternion)stream.ReceiveNext();
_rb.velocity = (Vector3)stream.ReceiveNext();
float lag = Mathf.Abs((float)(PhotonNetwork.time - info.timestamp));
_networkPosition += (_rb.velocity * lag);
}
}
void Start()
{
_rb = GetComponent<Rigidbody>();
}
public void FixedUpdate()
{
if (!photonView.isMine)
{
_rb.position = Vector3.MoveTowards(_rb.position, _networkPosition, Time.fixedDeltaTime);
_rb.rotation = Quaternion.RotateTowards(_rb.rotation, _networkRotation, Time.fixedDeltaTime * 100.0f);
}
}
}
728x90