On 12/23/11 11:06, Greg Ercolano wrote:
> On 12/22/11 12:27, David FLEURY wrote:
>> You are right, I will see for a Tree Item solution, to avoid regression 
>> somewhere else.
>> I do not know well enough fltk to have any opinion on this subject.
>> Just try to make my tests work for my own configuration.
> 
>       I was noodling with creating an Fl_Tree of 65536 in size,
>       and I can definitely see some room for optimization;
>       adding elements is slow, and scrolling elements is slow.
> 
>       I'll see if I can take a stab at optimizing that so that
>       adding elements is quicker, and also changing the draw()
>       routine so that it only draws items that are within the window.

    OK, just checked in r9216 which should optimize Fl_Tree
    quite a bit. David, please give it a try:

        Adding items in a large linear list should be quite a bit
        faster now; the slowness was due to repeat calls to find_child()
        unnecessarily to figure out the insert point, which was causing
        the exponential slowness.

        Drawing items should be much faster and should not suffer
        the wraparound issues described, because now draw() only draws
        items whose y() positions are within the Fl_Tree xywh area.

   I tested with the following code that creates 100k items
   which is entirely unusable in r9215 and lower, but should be
   quite normal in r9216 and up.

   There is still a practical limit on the number of items that
   can be in the tree; draw() will still /consider/ (ie. do calculations
   on) items that are not hidden (ie. open() and visible()), but at least
   it won't try to /draw/ items unless they're inside the window.

--------------------------------------------------------------------
        
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Tree.H>
int main( int argc, char **argv) {
   Fl_Double_Window *w = new Fl_Double_Window(900,300);
   Fl_Tree          *b = new Fl_Tree(10,10,w->w()-20,w->h()-20);
   char s[80];
   for ( int t=0; t<60000; t++ )
   {
       sprintf(s, "Entry #%06d", t);
       b->add(s);
       if ( t % 50 == 0 ) printf("Working on %d\n", t);
   }
   w->resizable(b);
   w->end();
   w->show();
   return(Fl::run());
}
--------------------------------------------------------------------
_______________________________________________
fltk mailing list
fltk@easysw.com
http://lists.easysw.com/mailman/listinfo/fltk

Reply via email to