Mailing list archives : pcb-rnd

ID:2623
From:ge...@igor2.repo.hu
Date:Tue, 29 Jan 2019 05:07:14 +0100 (CET)
Subject:[pcb-rnd] poly clipping performance optimization (was Re: Bug: missed polygon
in-reply-to:2622 from Gabriel Paubert <pa...@iram.es>
replies: 2624 from Gabriel Paubert <pa...@iram.es>
  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
 
--0-106756605-1548734834=:21900
Content-Type: TEXT/PLAIN; charset=US-ASCII
 
 
 
On Mon, 28 Jan 2019, Gabriel Paubert wrote:
 
>On the board I'm working right now, I also sometimes have performance
>issues when moving things around or performing cut and paste actions.
>But I've not really found a way of producing a testcase, it seems to be
>due to the size and complexity of the board (7 to 8MB .lht file).
 
The file size matters only for the loader/saver, but the low level lihata 
loader and the high level parser (the io_lihata plugin) take up a rather 
small part in even the load time. And once your data is in memor, file 
formats do not matter any more.
 
The usual suspect for performance issues:
 
1. --debug; please compare the --debug to the non-debug build. The --debug 
build does a lot of extra runtime checks, which are sometimes slower than 
the original operation you are perofrming. Plus --debug turns off compiler 
optimization
 
2. poly rendering - try the thin draw mode and see if it improves
 
3. poly clipping - try removing some large polygons first, do the same 
operations and see if it went faster
 
For 3, I've been working on doing some generic improvements compared to 
the original code, see details at the bottom. We now have some 
infrastructure that can be used to boost poly clipping at specific parts 
of the code. After reading your mail, I've added an option for using this 
with subcircuit buffer operations and mass selected object operations. I 
got good speedup on 2 examples (see attached).
 
=== test request ===
 
1. preparation
 
First, get the latest svn version. Then pick a board and an operation. I 
recommend using test boards first, like the ones attached, with 256 
clearing lines within or outside of subc. If your hardware is stronger 
than mine you may need to place multiple copies of these objects - make 
sure clearances are always in islands (lines are not too close) and the 
whole thing is covered with a single large poly. 
 
2. time the original setup
 
Pick one operation and try to time how fast it goes. If it's faster 
than 4 sec, go back to 1 and increase the size of the example. It's 
enough to just count the seconds in head, if the optimization works, 
it gives you a factor of 3..4 of speedup, that's very easy to notice 
even with mental timing. Repeat the timing a few times.
 
3. enable the optimization
 
Execute action brave() - you will get a popup. Tick in the poly batch 
clipping entry. You can turn it on or off any time. Once we find the 
optimizations both efficient and safe, we will remove the brave setting 
and make it default (but this sort of things wouldn't happen a few weeks 
before the release, like we are now)
 
4. repeat the test
 
Do the same test on the same board as in step 2, with the same mental 
timing. Preferrably on the same zoom level. The only diff shall be the 
tick in the brave dialog.
 
For me these things speeded up:
 
- moving the subc (subc example)
 
- cutting the subc to buffer (subc example)
 
- cutting all selected lines to buffer (lines example)
 
- removing all selected lines (lines example)
 
How you can help:
 
If you see performance problems and you have large polygons, please try to 
narrow it down to a single operation on a specific board. Please try with 
and without the batch clipping brave setting. If you see speedup, it's 
already handled and we can't do much about it on the poly level. If 
there's no speedup, and you are sure a lot of poly clipping is involved, 
please try to reproduce the problem with the same operation on an example 
board similar to the attached ones. Then mail me the example and the 
recipe and I will check if the optimization works on that operation.
 
Once we figure where we need this optimization it's rather easy to install 
and with the brave setting it's easy to test the effect. However, we 
really need to figure where we need it: the nature of the optimization is 
that we can't just put One Big "do_it_fast_please()" call in main() and 
lean back, but we need to do the optimization operation by operation, see 
below.
 
 
 
=== boring background (code stuff) ===
 
Polygon clipping is very expensive. We don't have arc in poly contour, so 
any circular cutout (2 of them per line in our examples) is approximated 
with a bunch of lines. This means every tiny line in the example really 
means more than 40 new polygon edges. For our 256 line objects that means 
the polygon has more than 10k(!) edges.
 
The poly clipping code has a lot of clever optimizations, but if you need 
to make a new cutout or remove an old cutout, this gets expensive. In any 
such operation dealing with a single contour line we need to check a lot 
other contour lines whehther they interfere. The code uses rtrees and 
everyhting, but this is still noticable effort if you have 10k edges to 
deal with.
 
Now if you remove 256 line objects at once, it's really removing 256 line 
objects one by one. Normally for each of them the whole poly is 
recalculated.
 
My predecessors had a plan to auto-batch operations on the polygon 
clipping code level, low level: the code tries to batch some operations 
and do them at once when enough of them accumulated. This reduces the 
number of clippings some. But on that level the code has no idea about the 
big picture, what we are really doing and when that really ends.
 
Optimally we would do the clipping only once, when we already removed all 
256 lines. But for that we really need to know when mass operations starts 
and end, and that's never the case within the poly code.
 
When I figured this a year ago, I implemented a poly clip inhibit 
mechanism. Before doing a batch operation, the high level code tells 
pcb-rnd core that the current pcb_data_t should be frozen for poly 
clipping - no operation should do any actual calculation, just mark the 
polygon dirty. Once the freeze is removed, all dirty polygons are 
reclipped at once. This is called poly clip inhibit.
 
High level code, such as subc operation or "do this on all selected 
objects" function know exactly when they start and when they finish. With 
the brave setting they install and remove an inhibit on start and exit.  
It's much more efficient than trying to guess from the low level poly 
clipping code. The inhibit mechanism is recursive: nested operations can 
do their own inhibits and only the outermost operation's inhibit-removal 
will cause actual poly clipping. So it doesn't break when you have a lot 
of subcircuits selected and do an operation on them.
 
Best regards,
 
Igor2
 
 
--0-106756605-1548734834=:21900
Content-Type: APPLICATION/octet-stream; name=line256.lht.gz
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.DEB.2.00.1901290507140.21900@igor2priv>
Content-Description: 
Content-Disposition: attachment; filename=line256.lht.gz
 
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
HT/sjy//BoYfDvUD3QAA
 
--0-106756605-1548734834=:21900
Content-Type: APPLICATION/octet-stream; name=subc256.lht.gz
Content-Transfer-Encoding: BASE64
Content-ID: <alpine.DEB.2.00.1901290507141.21900@igor2priv>
Content-Description: 
Content-Disposition: attachment; filename=subc256.lht.gz
 
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
o3HFFQWWKmw6co9GFh4KKFXYdOQOxxZXEEiqUJHqaeFKR2K9JlQOpSK10wIU
hlivCZVDqUjltBAFwQVUDqUiddMCFJbgAiqHUqVILXYkV2xiyaLUCRCGXLGJ
pQpWpECQTGCJgvEECEsygaUJltkHZgn/ZLGoyOwDG6VQHDKDUjwTt0cpFIfM
oBTPxO0wheKQGRRP7QOzpH/CEoVI7QMLh9o+CCxNiFTMDkfaAQgoSYhUzA4G
2j4GKEVEaqWFKxyJdZpYyVOkWlqAwhDrNLGyp0i9tBAFwQVW+hSpmBagsAQX
WPlTtGaajE7jhSscobiI1kyT0Wm8AAWWLqI102R0Gi9EAcVFtGaajE7jBSiw
dKEz+8As4aOwUiid2QcWZlFXFFg5lMnE7jCN8lBAJVEmE7uDPOoKAiqLMsld
YJb0UFiqMMldYIEmAhRYqrDJyB1oIkQBpQqbjNy+JgIQf7wqvF9de/3rtg6a
W7Tbbd1NZhO/rb7dhkcujbzd3V0b2+3ni/tq/+I1uG6WnlXumkX7PG82zWY1
+Ty5aWO4/qGd/1Av+hCk99xvcw3h/43PcHet/2cMY7tri6O78p98MX7kVd93
zXzf1+PnPjng7dp1PWu7ZtVsftEbpCN13mgkZTnVyQJE74Xk5ReCEF9Lh3vt
JRvJ+b1AvP56Hdy88pPnZrcYHfrUdP2+Wn+JNlx797tm/eNIG+xdtNHXL/1A
xihr2rkntVnNvqmm26qrN/20q5+W9e4bR4ZHzKvzrOffd4vKPb6yKD5Mnpx1
xZe4n+XrZug/dD6Tp3Vb9XVHu6RJ1/buwQ3Ocfj5KpIOD/TLXVXw//njvlm6
Gxb/M+pf7X9a++fv5D9+/vG/337/t7+4n2+9aw//OA7W1WvdDQ/hLqB2dbZs
oPUEZ9W1++2M31EEX9iNUeuu37br11W7Gah1bs/ThTjFDO9deljV7XPdd6/h
azx0uunbfRey9nl48B8m5UmRITOfJ+XUHqfY8xdMebMZnz22fXPm+rv3Wsfe
qgPQAbz3+lA8uoi1boeA9flPZj78OZ3j8bcLPfO279vnMUOlz1BZfBVFtxbw
Sj4tlmMLhhdktVn63bNf/4Lc9l4WojZzAv/IAP6b4F8suS6KsQXNph8eP/P7
F37/+p26l8LMpSC6L/3upd+9fKfuzVxzKcfdt/t+CJZ+78rv3b5T70VhFMm+
H3oGC3RAP4uaUO37dlZ++CpThp+YDMZ2mMCO382MbbXrA0asb0fxznYslkUR
9wrP1S54HGUQOOK0uDRnMOPrzXl6ij2W04tyY1HoKMs/wKQbssrAe5b8d6Fr
t277++3aJTWBHy1DRyre2Za4SznYst9ErAncainfXVC+izn+M7TgOtjUzsvt
zne71prNdt8fPx2uOgwahtTpcddXi+M7NmQtg6Wnu9wV52/MNtVz7bp0Gnk8
0H8XpIDD8QHB4dQJytEqLz+b2A9h7uZuL2+bHzzSqPXh0NDqqZdo4+a2cXbb
+KCmuOnDGbLxsrhtnd+2fhyrj9o/HsyZ7zpgt32IsI9Vt30U42ezn7thRXV8
7C6y1t2G7GTcvAyb/+fhbtL8TOPy1nx1a756R/P1e5ovbs03t+abdzTfjppf
t/Nq/XjKTkb9zNv9Zll1r2Tjyju+3btcfTe0uXdiPmr1IriRoI8uPf7mHs8N
XV6fYlweHyY8ou0y2lVEgteO0iosI52waCcJJ3LtLNqJjvTBo33E/OC18bQr
LCNiL0dq3z7Xi4+j9odDdKM8+hJsb1+CkfD3v7gn8QWv2zHKuNu2i/l9t1ne
u4Hv0/2n41sx5OGf6u6nrjmnEu7IsnbDgs3JtuE7jMcnN1Z+PHwhUFwPHr4U
Gb5UOH1L8ampHi/fWbnj7PAVxuT5+XJ22TVrp6rV48f2cCcvp9Jd0KyvjfoN
FCfAmzo4PHwxfL1rGA4/Nrt1/Vh1dTV0W5x+psf7L98OHM55t55pqJdN356/
B1h1zXLnoL64q8XlyHCrHN16eK5vd/8HbJ5EUpPhAAA=
 
--0-106756605-1548734834=:21900--
 

Reply subtree:
2623 [pcb-rnd] poly clipping performance optimization (was Re: Bug: missed polygon from ge...@igor2.repo.hu
  2624 Re: [pcb-rnd] poly clipping performance optimization (was Re: Bug: from Gabriel Paubert <pa...@iram.es>
    2625 Re: [pcb-rnd] poly clipping performance optimization - padstack, from ge...@igor2.repo.hu
    2628 [pcb-rnd] subc remove undo segfault (was: poly clipping performance from ge...@igor2.repo.hu
    2629 Re: [pcb-rnd] poly clipping performance optimization (was Re: Bug: from ge...@igor2.repo.hu
      2632 Re: [pcb-rnd] poly clipping performance optimization (was Re: Bug: from Gabriel Paubert <pa...@iram.es>
    2630 Re: [pcb-rnd] poly clipping performance optimization (was Re: Bug: from ge...@igor2.repo.hu
      2633 Re: [pcb-rnd] poly clipping performance optimization (was Re: Bug: from Gabriel Paubert <pa...@iram.es>
    2631 Re: [pcb-rnd] poly clipping performance optimization - experimental from ge...@igor2.repo.hu
      2655 Re: [pcb-rnd] poly clipping performance optimization - experimental from Gabriel Paubert <pa...@iram.es>
        2658 Re: [pcb-rnd] poly clipping performance optimization - experimental from ge...@igor2.repo.hu
          2672 Re: [pcb-rnd] poly clipping performance optimization - experimental from ge...@igor2.repo.hu
            2673 Re: [pcb-rnd] poly clipping performance optimization - experimental from Gabriel Paubert <pa...@iram.es>
              2674 Re: [pcb-rnd] poly clipping performance optimization - experimental from ge...@igor2.repo.hu