From 40b16f1705bd6361d7fd0cd2bc458ae9ea381bf1 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 10 Jul 2017 22:01:38 +0100 Subject: [PATCH] SimpleAngularDistance update prioritization scheme ameks no sense without ordered dequeue of the updates --- OpenSim/Framework/PriorityQueue.cs | 21 +++++++++++++ .../ClientStack/Linden/UDP/LLClientView.cs | 30 ++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/OpenSim/Framework/PriorityQueue.cs b/OpenSim/Framework/PriorityQueue.cs index 5b9185e5c8..22ffcdc8b6 100644 --- a/OpenSim/Framework/PriorityQueue.cs +++ b/OpenSim/Framework/PriorityQueue.cs @@ -216,6 +216,27 @@ namespace OpenSim.Framework return false; } + public bool TryOrderedDequeue(out EntityUpdate value, out Int32 timeinqueue) + { + // If there is anything in imediate queues, return it first no + // matter what else. Breaks fairness. But very useful. + for (int iq = 0; iq < NumberOfQueues; iq++) + { + if (m_heaps[iq].Count > 0) + { + MinHeapItem item = m_heaps[iq].RemoveMin(); + m_lookupTable.Remove(item.Value.Entity.LocalId); + timeinqueue = Util.EnvironmentTickCountSubtract(item.EntryTime); + value = item.Value; + return true; + } + } + + timeinqueue = 0; + value = default(EntityUpdate); + return false; + } + /// /// Reapply the prioritization function to each of the updates currently /// stored in the priority queues. diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 954f21ff14..861b79ebe8 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4137,6 +4137,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP Vector3 mypos = Vector3.Zero; ScenePresence mysp = (ScenePresence)SceneAgent; + bool orderedDequeue = m_scene.UpdatePrioritizationScheme == UpdatePrioritizationSchemes.SimpleAngularDistance; // we should have a presence if(mysp == null) return; @@ -4151,8 +4152,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP while (maxUpdatesBytes > 0) { lock (m_entityUpdates.SyncRoot) - if (!m_entityUpdates.TryDequeue(out update, out timeinqueue)) - break; + { + if(orderedDequeue) + { + if (!m_entityUpdates.TryOrderedDequeue(out update, out timeinqueue)) + break; + } + else + { + if (!m_entityUpdates.TryDequeue(out update, out timeinqueue)) + break; + } + } PrimUpdateFlags updateFlags = (PrimUpdateFlags)update.Flags; @@ -4850,6 +4861,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP // OpenSim.Framework.Lazy> propertyUpdates = // new OpenSim.Framework.Lazy>(); + bool orderedDequeue = m_scene.UpdatePrioritizationScheme == UpdatePrioritizationSchemes.SimpleAngularDistance; EntityUpdate iupdate; Int32 timeinqueue; // this is just debugging code & can be dropped later @@ -4857,8 +4869,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP while (maxUpdateBytes > 0) { lock (m_entityProps.SyncRoot) - if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue)) - break; + { + if(orderedDequeue) + { + if (!m_entityProps.TryOrderedDequeue(out iupdate, out timeinqueue)) + break; + } + else + { + if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue)) + break; + } + } ObjectPropertyUpdate update = (ObjectPropertyUpdate)iupdate; if (update.SendFamilyProps)