Moved SendInitialDataToMe to earlier in CompleteMovement. Moved TriggerOnMakeRootAgent to the end of CompleteMovement.
Justin, if you read this, there's a long story here. Some time ago you placed SendInitialDataToMe at the very beginning of client creation (in LLUDPServer). That is problematic, as we discovered relatively recently: on TPs, as soon as the client starts getting data from child agents, it starts requesting resources back *from the simulator where its root agent is*. We found this to be the problem behind meshes missing on HG TPs (because the viewer was requesting the meshes of the receiving sim from the departing grid). But this affects much more than meshes and HG TPs. It may also explain cloud avatars after a local TP: baked textures are only stored in the simulator, so if a child agent receives a UUID of a baked texture in the destination sim and requests that texture from the departing sim where the root agent is, it will fail to get that texture. Bottom line: we need to delay sending the new simulator data to the viewer until we are absolutely sure that the viewer knows that its main agent is in a new sim. Hence, moving it to CompleteMovement. Now I am trying to tune the initial rez delay that we all experience in the CC. I think that when I fixed the issue described above, I may have moved SendInitialDataToMe to much later than it should be, so now I'm moving to earlier in CompleteMovement.cpu-performance
parent
cd64a70c79
commit
a412b1d682
|
@ -1469,7 +1469,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(uccp.CircuitCode.Code);
|
AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(uccp.CircuitCode.Code);
|
||||||
bool tp = (aCircuit.teleportFlags > 0);
|
bool tp = (aCircuit.teleportFlags > 0);
|
||||||
// Let's delay this for TP agents, otherwise the viewer doesn't know where to get meshes from
|
// Let's delay this for TP agents, otherwise the viewer doesn't know where to get resources from
|
||||||
if (!tp)
|
if (!tp)
|
||||||
client.SceneAgent.SendInitialDataToMe();
|
client.SceneAgent.SendInitialDataToMe();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1010,7 +1010,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// recorded, which stops the input from being processed.
|
// recorded, which stops the input from being processed.
|
||||||
MovementFlag = 0;
|
MovementFlag = 0;
|
||||||
|
|
||||||
m_scene.EventManager.TriggerOnMakeRootAgent(this);
|
// DIVA NOTE: I moved TriggerOnMakeRootAgent out of here and into the end of
|
||||||
|
// CompleteMovement. We don't want modules doing heavy computation before CompleteMovement
|
||||||
|
// is over.
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GetStateSource()
|
public int GetStateSource()
|
||||||
|
@ -1327,10 +1329,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
|
bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
|
||||||
MakeRootAgent(AbsolutePosition, flying);
|
MakeRootAgent(AbsolutePosition, flying);
|
||||||
ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
|
ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
|
||||||
|
// Remember in HandleUseCircuitCode, we delayed this to here
|
||||||
|
// This will also send the initial data to clients when TP to a neighboring region.
|
||||||
|
// Not ideal, but until we know we're TP-ing from a neighboring region, there's not much we can do
|
||||||
|
if (m_teleportFlags > 0)
|
||||||
|
SendInitialDataToMe();
|
||||||
|
|
||||||
// m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
|
// m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
|
||||||
|
|
||||||
if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
|
if (!string.IsNullOrEmpty(m_callbackURI))
|
||||||
{
|
{
|
||||||
// We cannot sleep here since this would hold up the inbound packet processing thread, as
|
// We cannot sleep here since this would hold up the inbound packet processing thread, as
|
||||||
// CompleteMovement() is executed synchronously. However, it might be better to delay the release
|
// CompleteMovement() is executed synchronously. However, it might be better to delay the release
|
||||||
|
@ -1358,9 +1365,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// Create child agents in neighbouring regions
|
// Create child agents in neighbouring regions
|
||||||
if (openChildAgents && !IsChildAgent)
|
if (openChildAgents && !IsChildAgent)
|
||||||
{
|
{
|
||||||
// Remember in HandleUseCircuitCode, we delayed this to here
|
|
||||||
SendInitialDataToMe();
|
|
||||||
|
|
||||||
IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IEntityTransferModule>();
|
||||||
if (m_agentTransfer != null)
|
if (m_agentTransfer != null)
|
||||||
Util.FireAndForget(delegate { m_agentTransfer.EnableChildAgents(this); });
|
Util.FireAndForget(delegate { m_agentTransfer.EnableChildAgents(this); });
|
||||||
|
@ -1382,6 +1386,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms",
|
// "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms",
|
||||||
// client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds);
|
// client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds);
|
||||||
|
|
||||||
|
// DIVA NOTE: moved this here from MakeRoot. We don't want modules making heavy
|
||||||
|
// computations before CompleteMovement is over
|
||||||
|
m_scene.EventManager.TriggerOnMakeRootAgent(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
Loading…
Reference in New Issue