使用 PUN 同步绘图
Synchronising drawing using PUN
我已经实现了类似于在 VR 中绘图的注释功能。绘图是一条 Unity 轨迹,它的形状取决于它的轨迹。这就是真正的问题所在。我们正在使用 PhotonTransformView
实时同步绘图,它会同步轨迹的世界位置。但是 here 是输出。同步出来的图和原图差别太大了
这里是同步配置代码:
public void SetupSync(int viewId, int controllingPlayer)
{
if (PhotonNetwork.inRoom)
{
photonView = gameObject.AddComponent<PhotonView>();
photonView.ownershipTransfer = OwnershipOption.Takeover;
photonView.synchronization = ViewSynchronization.ReliableDeltaCompressed;
photonView.viewID = viewId;
photonTransformView = gameObject.AddComponent<PhotonTransformView>();
photonTransformView.m_PositionModel.SynchronizeEnabled = true;
photonView.ObservedComponents = new List<Component>();
photonView.ObservedComponents.Add(photonTransformView);
photonView.TransferOwnership(controllingPlayer);
}
}
怎样才能让两个系统上的绘图更相似?我见过人们能够完美同步这些的案例。检查 this。他们在做什么?
是的,PhotonTransformView 不适合这个。
您可以每 x 毫秒发送一个可靠的 rpc,其中包含自上次 rpc 以来的点列表。那是实时绘制的时候,当绘图完成时,您将整个绘图定义缓存在给定绘图 ID 的数据库中。然后绘图完成后加入房间的玩家可以稍后检索绘图,甚至可以从绘图列表或任何任意逻辑加载。
总而言之,您需要两个不同的系统,一个是实时绘图,另一个是绘图完成后。
Martjin Pieters 的回答是正确的做法。
但是对于那些在不同情况下遇到相同问题的人,它来自这一行:
photonView.synchronization = ViewSynchronization.ReliableDeltaCompressed;
它基本上是在压缩数据,如果新数据与上次发送的数据太接近,则不会发送新数据。只需切换Unreliable
,所有数据将直接发送。
我已经实现了类似于在 VR 中绘图的注释功能。绘图是一条 Unity 轨迹,它的形状取决于它的轨迹。这就是真正的问题所在。我们正在使用 PhotonTransformView
实时同步绘图,它会同步轨迹的世界位置。但是 here 是输出。同步出来的图和原图差别太大了
这里是同步配置代码:
public void SetupSync(int viewId, int controllingPlayer)
{
if (PhotonNetwork.inRoom)
{
photonView = gameObject.AddComponent<PhotonView>();
photonView.ownershipTransfer = OwnershipOption.Takeover;
photonView.synchronization = ViewSynchronization.ReliableDeltaCompressed;
photonView.viewID = viewId;
photonTransformView = gameObject.AddComponent<PhotonTransformView>();
photonTransformView.m_PositionModel.SynchronizeEnabled = true;
photonView.ObservedComponents = new List<Component>();
photonView.ObservedComponents.Add(photonTransformView);
photonView.TransferOwnership(controllingPlayer);
}
}
怎样才能让两个系统上的绘图更相似?我见过人们能够完美同步这些的案例。检查 this。他们在做什么?
是的,PhotonTransformView 不适合这个。
您可以每 x 毫秒发送一个可靠的 rpc,其中包含自上次 rpc 以来的点列表。那是实时绘制的时候,当绘图完成时,您将整个绘图定义缓存在给定绘图 ID 的数据库中。然后绘图完成后加入房间的玩家可以稍后检索绘图,甚至可以从绘图列表或任何任意逻辑加载。
总而言之,您需要两个不同的系统,一个是实时绘图,另一个是绘图完成后。
Martjin Pieters 的回答是正确的做法。 但是对于那些在不同情况下遇到相同问题的人,它来自这一行:
photonView.synchronization = ViewSynchronization.ReliableDeltaCompressed;
它基本上是在压缩数据,如果新数据与上次发送的数据太接近,则不会发送新数据。只需切换Unreliable
,所有数据将直接发送。