diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index cddc7b2532..b2a80bec29 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -324,8 +324,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private readonly IGroupsModule m_GroupsModule; private int m_cachedTextureSerial; - private PriorityQueue m_entityUpdates; - private Dictionary m_seenPrims = new Dictionary(); + private PriorityQueue m_entityUpdates; /// /// List used in construction of data blocks for an object update packet. This is to stop us having to @@ -439,7 +438,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_scene = scene; - m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); + m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); m_fullUpdateDataBlocksBuilder = new List(); m_killRecord = new HashSet(); @@ -3499,14 +3498,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP { canUseCompressed = false; } - else - { - if (!m_seenPrims.ContainsKey(((SceneObjectPart)update.Entity).LocalId)) - { - updateFlags = PrimUpdateFlags.FullUpdate; - m_seenPrims[((SceneObjectPart)update.Entity).LocalId] = true; - } - } if (updateFlags.HasFlag(PrimUpdateFlags.FullUpdate)) { @@ -3626,7 +3617,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { //m_log.Debug("[CLIENT]: Reprioritizing prim updates for " + m_firstName + " " + m_lastName); - PriorityQueue.UpdatePriorityHandler update_priority_handler = + PriorityQueue.UpdatePriorityHandler update_priority_handler = delegate(ref double priority, uint local_id) { priority = handler(new UpdatePriorityData(priority, local_id)); @@ -11592,26 +11583,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #region PriorityQueue - public class PriorityQueue + public class PriorityQueue { - internal delegate bool UpdatePriorityHandler(ref TPriority priority, uint local_id); + internal delegate bool UpdatePriorityHandler(ref double priority, uint local_id); private MinHeap[] m_heaps = new MinHeap[1]; private Dictionary m_lookupTable; - private Comparison m_comparison; + private Comparison m_comparison; private object m_syncRoot = new object(); internal PriorityQueue() : - this(MinHeap.DEFAULT_CAPACITY, Comparer.Default) { } + this(MinHeap.DEFAULT_CAPACITY, Comparer.Default) { } internal PriorityQueue(int capacity) : - this(capacity, Comparer.Default) { } - internal PriorityQueue(IComparer comparer) : - this(new Comparison(comparer.Compare)) { } - internal PriorityQueue(Comparison comparison) : + this(capacity, Comparer.Default) { } + internal PriorityQueue(IComparer comparer) : + this(new Comparison(comparer.Compare)) { } + internal PriorityQueue(Comparison comparison) : this(MinHeap.DEFAULT_CAPACITY, comparison) { } - internal PriorityQueue(int capacity, IComparer comparer) : - this(capacity, new Comparison(comparer.Compare)) { } - internal PriorityQueue(int capacity, Comparison comparison) + internal PriorityQueue(int capacity, IComparer comparer) : + this(capacity, new Comparison(comparer.Compare)) { } + internal PriorityQueue(int capacity, Comparison comparison) { m_lookupTable = new Dictionary(capacity); @@ -11632,12 +11623,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - public bool Enqueue(TPriority priority, TValue value, uint local_id) + public bool Enqueue(double priority, EntityUpdate value, uint local_id) { LookupItem item; if (m_lookupTable.TryGetValue(local_id, out item)) { + // Combine flags + value.Flags |= item.Heap[item.Handle].Value.Flags; + item.Heap[item.Handle] = new MinHeapItem(priority, value, local_id, this.m_comparison); return false; } @@ -11650,7 +11644,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - internal TValue Peek() + internal EntityUpdate Peek() { for (int i = 0; i < m_heaps.Length; ++i) if (m_heaps[i].Count > 0) @@ -11658,7 +11652,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP throw new InvalidOperationException(string.Format("The {0} is empty", this.GetType().ToString())); } - internal bool TryDequeue(out TValue value) + internal bool TryDequeue(out EntityUpdate value) { for (int i = 0; i < m_heaps.Length; ++i) { @@ -11671,14 +11665,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - value = default(TValue); + value = default(EntityUpdate); return false; } internal void Reprioritize(UpdatePriorityHandler handler) { MinHeapItem item; - TPriority priority; + double priority; foreach (LookupItem lookup in new List(this.m_lookupTable.Values)) { @@ -11704,16 +11698,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region MinHeapItem private struct MinHeapItem : IComparable { - private TPriority priority; - private TValue value; + private double priority; + private EntityUpdate value; private uint local_id; - private Comparison comparison; + private Comparison comparison; - internal MinHeapItem(TPriority priority, TValue value, uint local_id) : - this(priority, value, local_id, Comparer.Default) { } - internal MinHeapItem(TPriority priority, TValue value, uint local_id, IComparer comparer) : - this(priority, value, local_id, new Comparison(comparer.Compare)) { } - internal MinHeapItem(TPriority priority, TValue value, uint local_id, Comparison comparison) + internal MinHeapItem(double priority, EntityUpdate value, uint local_id) : + this(priority, value, local_id, Comparer.Default) { } + internal MinHeapItem(double priority, EntityUpdate value, uint local_id, IComparer comparer) : + this(priority, value, local_id, new Comparison(comparer.Compare)) { } + internal MinHeapItem(double priority, EntityUpdate value, uint local_id, Comparison comparison) { this.priority = priority; this.value = value; @@ -11721,8 +11715,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP this.comparison = comparison; } - internal TPriority Priority { get { return this.priority; } } - internal TValue Value { get { return this.value; } } + internal double Priority { get { return this.priority; } } + internal EntityUpdate Value { get { return this.value; } } internal uint LocalID { get { return this.local_id; } } public override string ToString()