From e2d351c9de4ee9c8b04376228f3ab5b9310392c9 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Thu, 4 Aug 2016 15:45:02 +0200 Subject: Set regLayout.ALL to new object to prevent queuing in layout or drawing, set to regLayout.None just before adding parent LayoutingTries moved into LQI --- src/LayoutingQueueItem.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'src/LayoutingQueueItem.cs') diff --git a/src/LayoutingQueueItem.cs b/src/LayoutingQueueItem.cs index 82673444..8ffb7dbf 100644 --- a/src/LayoutingQueueItem.cs +++ b/src/LayoutingQueueItem.cs @@ -45,6 +45,8 @@ namespace Crow public ILayoutable GraphicObject; /// Bitfield containing the element of the layout to performs (x|y|width|height) public LayoutingType LayoutType; + /// Unsuccessfull UpdateLayout and requeueing count + public int LayoutingTries; #region CTOR public LayoutingQueueItem (LayoutingType _layoutType, ILayoutable _graphicObject) @@ -58,7 +60,7 @@ namespace Crow public void ProcessLayouting() { - if (GraphicObject.Parent == null) { + if (GraphicObject.Parent == null) {//TODO:improve this //cancel layouting for object without parent, maybe some were in queue when //removed from a listbox Debug.WriteLine ("ERROR: processLayouting, no parent for: " + this.ToString ()); @@ -71,14 +73,13 @@ namespace Crow #if DEBUG_LAYOUTING Debug.WriteLine ("\tRequeuing => " + this.ToString ()); #endif - GraphicObject.LayoutingTries ++; - if (GraphicObject.LayoutingTries < Interface.MaxLayoutingTries) { + LayoutingTries ++; + if (LayoutingTries < Interface.MaxLayoutingTries) { GraphicObject.RegisteredLayoutings |= LayoutType; Interface.CurrentInterface.LayoutingQueue.Enqueue (this); } - } else { - GraphicObject.LayoutingTries = 0; - } + } else + LayoutingTries = 0; } public static implicit operator GraphicObject(LayoutingQueueItem queueItem) -- cgit v1.3.1-4-g156e From b58c6b328c06784d31765b29b574bed17082be27 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Thu, 4 Aug 2016 19:48:05 +0200 Subject: Layouting DiscardQueue with MaxDiscardCount modifié : src/Interface.cs modifié : src/LayoutingQueueItem.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit modifié : src/GraphicObjects/ListBox.cs --- src/GraphicObjects/ListBox.cs | 9 ++++----- src/Interface.cs | 17 ++++++++++++++--- src/LayoutingQueueItem.cs | 26 ++++++++++++++++++++------ 3 files changed, 38 insertions(+), 14 deletions(-) (limited to 'src/LayoutingQueueItem.cs') diff --git a/src/GraphicObjects/ListBox.cs b/src/GraphicObjects/ListBox.cs index 826eb388..fdb3960f 100644 --- a/src/GraphicObjects/ListBox.cs +++ b/src/GraphicObjects/ListBox.cs @@ -163,13 +163,12 @@ namespace Crow IMLStream itemStream = null; Type dataType = data [i].GetType (); - if (itemTemplates.ContainsKey (dataType.FullName)) { + if (itemTemplates.ContainsKey (dataType.FullName)) itemStream = itemTemplates [dataType.FullName]; - } else { + else itemStream = itemTemplates ["default"]; - } - lock (Interface.CurrentInterface.UpdateMutex) { + lock (Interface.CurrentInterface.LayoutMutex) { g = Interface.Load (itemStream); page.AddChild (g); g.DataSource = data [i]; @@ -181,7 +180,7 @@ namespace Crow //g.LogicalParent = this; } - lock (Interface.CurrentInterface.UpdateMutex) + lock (Interface.CurrentInterface.LayoutMutex) _list.AddChild (page); #if DEBUG_LOAD diff --git a/src/Interface.cs b/src/Interface.cs index 6d532164..ca5cb28f 100644 --- a/src/Interface.cs +++ b/src/Interface.cs @@ -81,7 +81,8 @@ namespace Crow public const int MaxCacheSize = 2048; /// Above this count, the layouting is discard for the widget and it /// will not be rendered on screen - public const int MaxLayoutingTries = 50; + public const int MaxLayoutingTries = 5; + public const int MaxDiscardCount = 10; /// Global font rendering settings for Cairo public static FontOptions FontRenderingOptions; #endregion @@ -89,6 +90,7 @@ namespace Crow internal bool XmlLoading = false; public Queue LayoutingQueue = new Queue (); + public Queue DiscardQueue; public Queue ProcessedLayoutingQueue; public Queue DrawingQueue = new Queue(); public string Clipboard;//TODO:use object instead for complex copy paste @@ -96,6 +98,12 @@ namespace Crow { // if (g.RegisteredLayoutings != LayoutingType.None) // return; + ILayoutable l = g; + while (l.Parent != null) + l = l.Parent; + if (!(l is Interface)) + return; + lock (DrawingQueue) { if (g.IsQueueForRedraw) return; @@ -400,14 +408,17 @@ namespace Crow #if MEASURE_TIME layoutTime.Restart(); #endif + DiscardQueue = new Queue (); lock (LayoutMutex) { //Debug.WriteLine ("======= Layouting queue start ======="); LayoutingQueueItem lqi = null; - while (Interface.CurrentInterface.LayoutingQueue.Count > 0) { - lqi = Interface.CurrentInterface.LayoutingQueue.Dequeue (); + while (LayoutingQueue.Count > 0) { + lqi = LayoutingQueue.Dequeue (); lqi.ProcessLayouting (); } + LayoutingQueue = DiscardQueue; } + DiscardQueue = null; #if MEASURE_TIME layoutTime.Stop (); diff --git a/src/LayoutingQueueItem.cs b/src/LayoutingQueueItem.cs index 8ffb7dbf..f35eb78d 100644 --- a/src/LayoutingQueueItem.cs +++ b/src/LayoutingQueueItem.cs @@ -46,7 +46,7 @@ namespace Crow /// Bitfield containing the element of the layout to performs (x|y|width|height) public LayoutingType LayoutType; /// Unsuccessfull UpdateLayout and requeueing count - public int LayoutingTries; + public int LayoutingTries, DiscardCount; #region CTOR public LayoutingQueueItem (LayoutingType _layoutType, ILayoutable _graphicObject) @@ -70,16 +70,30 @@ namespace Crow Debug.WriteLine ("Layouting => " + this.ToString ()); #endif if (!GraphicObject.UpdateLayout (LayoutType)) { - #if DEBUG_LAYOUTING - Debug.WriteLine ("\tRequeuing => " + this.ToString ()); - #endif - LayoutingTries ++; if (LayoutingTries < Interface.MaxLayoutingTries) { + #if DEBUG_LAYOUTING + Debug.WriteLine ("\tRequeuing => " + this.ToString ()); + #endif + LayoutingTries++; GraphicObject.RegisteredLayoutings |= LayoutType; Interface.CurrentInterface.LayoutingQueue.Enqueue (this); + } else if (DiscardCount < Interface.MaxDiscardCount) { + #if DEBUG_LAYOUTING + Debug.WriteLine ("\tDiscarding => " + this.ToString ()); + #endif + LayoutingTries = 0; + DiscardCount++; + GraphicObject.RegisteredLayoutings |= LayoutType; + Interface.CurrentInterface.DiscardQueue.Enqueue (this); } - } else + //#if DEBUG_LAYOUTING + else + Debug.WriteLine ("\tDELETED => " + this.ToString ()); + //#endif + } else { + DiscardCount = 0; LayoutingTries = 0; + } } public static implicit operator GraphicObject(LayoutingQueueItem queueItem) -- cgit v1.3.1-4-g156e From 351960c268b3a648c501d429521352f4fbe47535 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Fri, 5 Aug 2016 00:59:24 +0200 Subject: DEBUG_LAYOUTING:save every LQI in GraphicObjects for further analysis modifié : src/GraphicObjects/GraphicObject.cs modifié : src/LayoutingQueueItem.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/GraphicObjects/GraphicObject.cs | 33 ++++++++++++++----- src/LayoutingQueueItem.cs | 66 ++++++++++++++++++++++++++----------- 2 files changed, 71 insertions(+), 28 deletions(-) (limited to 'src/LayoutingQueueItem.cs') diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index 20173172..f2f2564f 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -101,8 +101,19 @@ namespace Crow /// IDEA is to add a ScreenCoordinates function that use only lastPaintedSlots /// public Rectangle LastPaintedSlot; + /// Prevent requeuing multiple times the same widget + public bool IsQueueForRedraw = false; + /// Random value placeholder public object Tag; + /// drawing Cache, if null, a redraw is done, cached or not public byte[] bmp; + /// + /// This size is computed on each child' layout changes. + /// In stacking widget, it is used to compute the remaining space for the stretched + /// widget inside the stack, which is never added to the contentSize, instead, its size + /// is deducted from (parent.ClientRectangle - contentSize) + /// + internal Size contentSize; #endregion #region ILayoutable @@ -116,12 +127,10 @@ namespace Crow get { return _parent; } set { _parent = value; } } - [XmlIgnore]public ILayoutable LogicalParent { get { return logicalParent == null ? Parent : logicalParent; } set { logicalParent = value; } } - [XmlIgnore]public virtual Rectangle ClientRectangle { get { Rectangle cb = Slot.Size; @@ -129,7 +138,6 @@ namespace Crow return cb; } } - public virtual Rectangle ContextCoordinates(Rectangle r){ GraphicObject go = Parent as GraphicObject; if (go == null) @@ -731,7 +739,6 @@ namespace Crow if (Parent != null) Parent.RegisterClip (clip + Slot.Position + ClientRectangle.Position); } - public bool IsQueueForRedraw = false; /// Full update, taking care of sizing policy [MethodImpl(MethodImplOptions.AggressiveInlining)] public void RegisterForGraphicUpdate () @@ -751,7 +758,11 @@ namespace Crow Interface.CurrentInterface.EnqueueForRepaint (this); } #region Layouting - internal Size contentSize; + + #if DEBUG_LAYOUTING + public List CurrentDrawLQIs = null; + public List> LQIs = new List>(); + #endif /// return size of content + margins protected virtual int measureRawSize (LayoutingType lt) { return lt == LayoutingType.Width ? @@ -784,9 +795,6 @@ namespace Crow if (layoutType == LayoutingType.None) return; - #if DEBUG_LAYOUTING - Debug.WriteLine ("REGLayout => {1}->{0}", layoutType, this.ToString()); - #endif //enqueue LQI LayoutingTypes separately if (layoutType.HasFlag (LayoutingType.Width)) Interface.CurrentInterface.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.Width, this)); @@ -805,7 +813,8 @@ namespace Crow public virtual void OnLayoutChanges(LayoutingType layoutType) { #if DEBUG_LAYOUTING - Debug.WriteLine ("\t " + LastSlots.ToString() + "\n\t => " + Slot.ToString ()); + LayoutingQueueItem.currentLQI.Slot = LastSlots; + LayoutingQueueItem.currentLQI.Slot = Slot; #endif switch (layoutType) { @@ -1029,6 +1038,12 @@ namespace Crow return; LastPaintedSlot = Slot; + #if DEBUG_LAYOUTING + if (CurrentDrawLQIs != null){ + LQIs.Add (CurrentDrawLQIs); + CurrentDrawLQIs = null; + } + #endif if (cacheEnabled) { if (Slot.Width > Interface.MaxCacheSize || Slot.Height > Interface.MaxCacheSize) diff --git a/src/LayoutingQueueItem.cs b/src/LayoutingQueueItem.cs index f35eb78d..b2a5f3ca 100644 --- a/src/LayoutingQueueItem.cs +++ b/src/LayoutingQueueItem.cs @@ -21,6 +21,7 @@ using System; using System.Diagnostics; using System.Collections.Generic; +using System.Linq; namespace Crow { @@ -42,63 +43,84 @@ namespace Crow public class LayoutingQueueItem { /// Instance of widget to be layouted - public ILayoutable GraphicObject; + public ILayoutable Layoutable; /// Bitfield containing the element of the layout to performs (x|y|width|height) public LayoutingType LayoutType; /// Unsuccessfull UpdateLayout and requeueing count public int LayoutingTries, DiscardCount; + #if DEBUG_LAYOUTING + public static List processedLQIs = new List(); + public static LayoutingQueueItem[] MultipleRunsLQIs { + get { return processedLQIs.Where(l=>l.LayoutingTries>2 || l.DiscardCount > 0).ToArray(); } + } + public static LayoutingQueueItem currentLQI = null; + public Stopwatch LQITime = new Stopwatch(); + public List triggeredLQIs = new List(); + public LayoutingQueueItem wasTriggeredBy = null; + public GraphicObject graphicObject { + get { return Layoutable as GraphicObject; } + } + public Rectangle Slot, NewSlot; + #endif + #region CTOR public LayoutingQueueItem (LayoutingType _layoutType, ILayoutable _graphicObject) { LayoutType = _layoutType; - GraphicObject = _graphicObject; - GraphicObject.RegisteredLayoutings |= LayoutType; + Layoutable = _graphicObject; + Layoutable.RegisteredLayoutings |= LayoutType; + #if DEBUG_LAYOUTING + if (graphicObject.CurrentDrawLQIs == null) + graphicObject.CurrentDrawLQIs = new List(); + graphicObject.CurrentDrawLQIs.Add(this); + if (currentLQI != null){ + wasTriggeredBy = currentLQI; + currentLQI.triggeredLQIs.Add(this); + } + #endif } #endregion public void ProcessLayouting() { - if (GraphicObject.Parent == null) {//TODO:improve this + if (Layoutable.Parent == null) {//TODO:improve this //cancel layouting for object without parent, maybe some were in queue when //removed from a listbox Debug.WriteLine ("ERROR: processLayouting, no parent for: " + this.ToString ()); return; } #if DEBUG_LAYOUTING - Debug.WriteLine ("Layouting => " + this.ToString ()); + currentLQI = this; + processedLQIs.Add(this); + LQITime.Start(); #endif - if (!GraphicObject.UpdateLayout (LayoutType)) { + if (!Layoutable.UpdateLayout (LayoutType)) { if (LayoutingTries < Interface.MaxLayoutingTries) { - #if DEBUG_LAYOUTING - Debug.WriteLine ("\tRequeuing => " + this.ToString ()); - #endif LayoutingTries++; - GraphicObject.RegisteredLayoutings |= LayoutType; + Layoutable.RegisteredLayoutings |= LayoutType; Interface.CurrentInterface.LayoutingQueue.Enqueue (this); } else if (DiscardCount < Interface.MaxDiscardCount) { - #if DEBUG_LAYOUTING - Debug.WriteLine ("\tDiscarding => " + this.ToString ()); - #endif LayoutingTries = 0; DiscardCount++; - GraphicObject.RegisteredLayoutings |= LayoutType; + Layoutable.RegisteredLayoutings |= LayoutType; Interface.CurrentInterface.DiscardQueue.Enqueue (this); } //#if DEBUG_LAYOUTING else Debug.WriteLine ("\tDELETED => " + this.ToString ()); //#endif - } else { - DiscardCount = 0; - LayoutingTries = 0; } + #if DEBUG_LAYOUTING + currentLQI = null; + LQITime.Stop(); + #endif } public static implicit operator GraphicObject(LayoutingQueueItem queueItem) { - return queueItem.GraphicObject as GraphicObject; + return queueItem.Layoutable as GraphicObject; } public static implicit operator LayoutingType(LayoutingQueueItem lqi) { @@ -106,7 +128,13 @@ namespace Crow } public override string ToString () { - return string.Format ("{1}->{0}", LayoutType,GraphicObject.ToString()); + #if DEBUG_LAYOUTING + return string.Format ("{2};{3};{4} {1}->{0}", LayoutType,Layoutable.ToString(), + LayoutingTries,DiscardCount,LQITime.ElapsedTicks); + #else + return string.Format ("{2};{3} {1}->{0}", LayoutType,Layoutable.ToString(), + LayoutingTries, DiscardCount); + #endif } } } -- cgit v1.3.1-4-g156e