added experimental method of trying to relieve missing prim problem (by adding a limit of the number of prim update packets sent in each update loop).
parent
3586beb81b
commit
804e87861b
|
@ -928,13 +928,14 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAllSceneObjectsToClient(IClientAPI client)
|
public void SendAllSceneObjectsToClient(ScenePresence presence)
|
||||||
{
|
{
|
||||||
foreach (EntityBase ent in Entities.Values)
|
foreach (EntityBase ent in Entities.Values)
|
||||||
{
|
{
|
||||||
if (ent is SceneObjectGroup)
|
if (ent is SceneObjectGroup)
|
||||||
{
|
{
|
||||||
((SceneObjectGroup)ent).SendFullUpdateToClient(client);
|
// ((SceneObjectGroup)ent).SendFullUpdateToClient(client);
|
||||||
|
((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1229,6 +1230,17 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private void forceClientUpdate()
|
||||||
|
{
|
||||||
|
foreach (EntityBase ent in this.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent is SceneObjectGroup)
|
||||||
|
{
|
||||||
|
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void ProcessConsoleCmd(string command, string[] cmdparams)
|
public void ProcessConsoleCmd(string command, string[] cmdparams)
|
||||||
{
|
{
|
||||||
switch (command)
|
switch (command)
|
||||||
|
@ -1243,12 +1255,14 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
MainLog.Instance.Error("show users - show info about connected users in the current region.");
|
MainLog.Instance.Error("show users - show info about connected users in the current region.");
|
||||||
MainLog.Instance.Error("shutdown - disconnect all clients and shutdown.");
|
MainLog.Instance.Error("shutdown - disconnect all clients and shutdown.");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "show":
|
case "show":
|
||||||
if (cmdparams.Length > 0)
|
if (cmdparams.Length > 0)
|
||||||
{
|
{
|
||||||
Show(cmdparams[0]);
|
Show(cmdparams[0]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "save-xml":
|
case "save-xml":
|
||||||
if (cmdparams.Length > 0)
|
if (cmdparams.Length > 0)
|
||||||
{
|
{
|
||||||
|
@ -1277,13 +1291,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
case "force-update":
|
case "force-update":
|
||||||
Console.WriteLine("Updating all clients");
|
Console.WriteLine("Updating all clients");
|
||||||
foreach(EntityBase ent in this.Entities.Values)
|
this.forceClientUpdate();
|
||||||
{
|
|
||||||
if (ent is SceneObjectGroup)
|
|
||||||
{
|
|
||||||
((SceneObjectGroup)ent).ScheduleGroupForFullUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "backup":
|
case "backup":
|
||||||
|
|
|
@ -347,6 +347,22 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ScheduleFullUpdateToAvatar(ScenePresence presence)
|
||||||
|
{
|
||||||
|
foreach (SceneObjectPart part in this.m_parts.Values)
|
||||||
|
{
|
||||||
|
part.AddFullUpdateToAvatar(presence);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ScheduleTerseUpdateToAvatar(ScenePresence presence)
|
||||||
|
{
|
||||||
|
foreach (SceneObjectPart part in this.m_parts.Values)
|
||||||
|
{
|
||||||
|
part.AddTerseUpdateToAvatar(presence);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -391,14 +391,14 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
{
|
{
|
||||||
if (m_updateFlag == 1) //some change has been made so update the clients
|
if (m_updateFlag == 1) //some change has been made so update the clients
|
||||||
{
|
{
|
||||||
SendTerseUpdateToAllClients();
|
AddTerseUpdateToAllAvatars();
|
||||||
ClearUpdateSchedule();
|
ClearUpdateSchedule();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
|
if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
|
||||||
{
|
{
|
||||||
SendFullUpdateToAllClients();
|
AddFullUpdateToAllAvatars();
|
||||||
ClearUpdateSchedule();
|
ClearUpdateSchedule();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -603,6 +603,20 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Client Update Methods
|
#region Client Update Methods
|
||||||
|
public void AddFullUpdateToAllAvatars()
|
||||||
|
{
|
||||||
|
List<ScenePresence> avatars = this.m_parentGroup.RequestSceneAvatars();
|
||||||
|
for (int i = 0; i < avatars.Count; i++)
|
||||||
|
{
|
||||||
|
avatars[i].AddFullPart(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddFullUpdateToAvatar(ScenePresence presence)
|
||||||
|
{
|
||||||
|
presence.AddFullPart(this);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -649,6 +663,22 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
m_text, ParentID, this.m_particleSystem, lRot);
|
m_text, ParentID, this.m_particleSystem, lRot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Terse updates
|
||||||
|
|
||||||
|
public void AddTerseUpdateToAllAvatars()
|
||||||
|
{
|
||||||
|
List<ScenePresence> avatars = this.m_parentGroup.RequestSceneAvatars();
|
||||||
|
for (int i = 0; i < avatars.Count; i++)
|
||||||
|
{
|
||||||
|
avatars[i].AddTersePart(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddTerseUpdateToAvatar(ScenePresence presence)
|
||||||
|
{
|
||||||
|
presence.AddTersePart(this);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -88,6 +88,12 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
public delegate void SignificantClientMovement(IClientAPI remote_client);
|
public delegate void SignificantClientMovement(IClientAPI remote_client);
|
||||||
public event SignificantClientMovement OnSignificantClientMovement;
|
public event SignificantClientMovement OnSignificantClientMovement;
|
||||||
|
|
||||||
|
// private Queue<SceneObjectGroup> m_fullGroupUpdates = new Queue<SceneObjectGroup>();
|
||||||
|
// private Queue<SceneObjectGroup> m_terseGroupUpdates = new Queue<SceneObjectGroup>();
|
||||||
|
|
||||||
|
private Queue<SceneObjectPart> m_fullPartUpdates = new Queue<SceneObjectPart>();
|
||||||
|
private Queue<SceneObjectPart> m_teserPartUpdates = new Queue<SceneObjectPart>();
|
||||||
|
|
||||||
#region Properties
|
#region Properties
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
|
@ -193,6 +199,54 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public void AddTersePart(SceneObjectPart part)
|
||||||
|
{
|
||||||
|
m_teserPartUpdates.Enqueue(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddFullPart(SceneObjectPart part)
|
||||||
|
{
|
||||||
|
m_fullPartUpdates.Enqueue(part);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendPrimUpdates()
|
||||||
|
{
|
||||||
|
if (m_teserPartUpdates.Count > 0)
|
||||||
|
{
|
||||||
|
bool terse = true;
|
||||||
|
int terseCount = 0;
|
||||||
|
|
||||||
|
while (terse)
|
||||||
|
{
|
||||||
|
SceneObjectPart part = m_teserPartUpdates.Dequeue();
|
||||||
|
part.SendTerseUpdate(this.ControllingClient);
|
||||||
|
terseCount++;
|
||||||
|
|
||||||
|
if ((m_teserPartUpdates.Count < 1) |(terseCount > 30))
|
||||||
|
{
|
||||||
|
terse = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_fullPartUpdates.Count > 0)
|
||||||
|
{
|
||||||
|
bool full = true;
|
||||||
|
int fullCount = 0;
|
||||||
|
|
||||||
|
while (full)
|
||||||
|
{
|
||||||
|
SceneObjectPart part = m_fullPartUpdates.Dequeue();
|
||||||
|
part.SendFullUpdate(this.ControllingClient);
|
||||||
|
fullCount++;
|
||||||
|
if ((m_fullPartUpdates.Count < 1) | (fullCount > 40))
|
||||||
|
{
|
||||||
|
full = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#region Status Methods
|
#region Status Methods
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Not Used, most likely can be deleted
|
/// Not Used, most likely can be deleted
|
||||||
|
@ -221,7 +275,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
this._physActor.Flying = isFlying;
|
this._physActor.Flying = isFlying;
|
||||||
this.newAvatar = true;
|
this.newAvatar = true;
|
||||||
this.childAgent = false;
|
this.childAgent = false;
|
||||||
this.m_scene.SendAllSceneObjectsToClient(this.ControllingClient);
|
this.m_scene.SendAllSceneObjectsToClient(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void MakeChildAgent()
|
protected void MakeChildAgent()
|
||||||
|
@ -399,6 +453,8 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void Update()
|
public override void Update()
|
||||||
{
|
{
|
||||||
|
this.SendPrimUpdates();
|
||||||
|
|
||||||
if (this.childAgent == false)
|
if (this.childAgent == false)
|
||||||
{
|
{
|
||||||
if (this.newForce)
|
if (this.newForce)
|
||||||
|
@ -500,7 +556,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
//this.SendFullUpdateToALLClients();
|
//this.SendFullUpdateToALLClients();
|
||||||
//this.SendArrearanceToAllOtherAgents();
|
//this.SendArrearanceToAllOtherAgents();
|
||||||
|
|
||||||
this.m_scene.SendAllSceneObjectsToClient(this.ControllingClient);
|
this.m_scene.SendAllSceneObjectsToClient(this);
|
||||||
this.ControllingClient.SendViewerTime(this.m_scene.TimePhase);
|
this.ControllingClient.SendViewerTime(this.m_scene.TimePhase);
|
||||||
|
|
||||||
//Please don't remove the following code (at least not yet), just leave it commented out
|
//Please don't remove the following code (at least not yet), just leave it commented out
|
||||||
|
|
Loading…
Reference in New Issue