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 H4sICNzHT1wCA2xpbmUyNTYubGh0AM1d247juBF9n68wkOc2RFK89aBfEiBA 3hbIBzRkW+3Wjm0ZtjzbnUH/eyhfSZpVk2x6N6cfdteUTNbx8akqmaza1+Zx O5897DaLh1nf7BYP383kx5cvk9fmsRmGXTc7DO0+jEwmkx+//O2vj4/LXbd4 fDxsuuHjad2tvkw+wt2r7nE/vK8ud4Y3/7NbbprV6eVk0TXrdmh3k6eJnFbr 9XFwaN+G5/28WbVhuLoNDa/d/Ns4ND0Pjq837X4fxkQYPC46LtIf36nEVF+G 5qu22TWb+Tgub7d+nG36pf8t2FAwSf4PJsl7k8QV408M+nsz3JsjlJ26y4y/ xyJ3b1Ftp7Iufkr6zqjA3MPQLV8Lppn6NvMfTJ+QsWEfp29ksKO5fsP23b/a s4nDa7tbN6ubOVNdjX/Hi2/H2eyVk/f09QX2+L0+T7ffNvNus0w/nkn/8rJ/ fouQHQfebwM3OxfN2c6gi22z2A/N/NvzdtcP/fC+PYtkvPV4Qz/7tZ0PZ+V8 nAdXzXu72x+VeDJv6LcP+255tjDcsng6WTFZ7vrD9kmdXoQ75/161m1G+38c h04LFdY637/qNu20roS8jU7exFOtT2R9nbyHF9XlxZt8qq2+XJHRlSvRT+Iy dCX0qZqaypsqCO3rdZGw9suqWUbWnL8Co0VP4ja4b1fB6nYRjX18yf8jQqI5 JJpEovGQOAaJJjnReJxIwSEhOdF4nMg6RaKlJnRyMx5TJ9JySDSJBI8TVTFI NMkJoE6U4pCQnADqRBlG8Yb0XQaQE88hIX2XweOk5mK8JTmxeJzUXIy3JCcW kBPHKN6QvgtQJ1pwSEjfBagTzcV4S3ICqBPNxXhLcgKoE5PF+JsA8rzLSOzn E6M4JJpEAsiJYZBokhPAvMt4DgnJCWDeZbMYbyz1fHJzV5g6sZpDokkkgJw4 BokmOQHUiRMcEpITQJ24mlG8IX0XYN7lLIeE9F2AeZfnYrwlOQHMuzwX4y3J CWDe5Q2jeEP6LkCdeM8hIX0Xnk5ExcV4S3KCpxNRcTHekpxYQE6yGG/J/ROL vX8ihOCQaBIJHieiZpBokhMNyInlkJCc4OVdQmYx3pH7Jw57/0RIxSHRJBJA TgyDRJOcAOpEeg4JyQmgTpRkFG9I34WXdwmlOSSk7wLMuxQX4y3JCWDeVXMx 3pKcAOZddc0o3pC+C1AnteWQkL4LUCeai/GW5ARQJ5qL8ZbkBFAnOovxntw/ 8dj7J0J7DokmkeBxYiSDRJOcAOZdRnNISE4A8y6TxXhP7p+ICnsDRVjBQdE0 FDxWbM1A0TQrgFKxloNCswKoFVcxqjek/wLMvZzikJD+CzD3clyctyQngLmX 4+K8JTkBzL28ZCRvaO8FKBSvOSi09wJUiucivaVZwZOKrLhIb2lW8LQiq5o5 2enIM6oOkBTLISHPqDo8TkTFIPEkJx6PE6E4JCQnHpATw5zsdOQZVUCdCM8h Ic+oAupESgaJJzkB1InUHBKSE0CdSK6GLoqGueSjSzBYFFdFJ83U2GDFHZLr BRwcXIwXU9FtCnychnEwcNFd+qkURS4uF2Bw1FztXKqPROqI+qi56rlYHwkS PH3UXGy/6SPlA0wfNRfVY32kXMDpQ0vmJKcjz6QC5llac0jIM6mAeZZ2DBJP cgKYZxnBISE5AcyzTM2c5HTkmVRAnRjLISHPpALqxFYMEk9yAqgTqzgkJCeA OrFczVyabyWSR8y3LFc1F+dbCRK8fMtxMf6Wb6V8gOVbjovucb6VcgGXbzmu Vi7VRyJ1RH14rlou1keCBE8fnovtN32kfIDpw3NRPdZHygWaPlRVMSc3HXkG FS/PUpXikJBnUPHyLFUZBoknOfGAnHgOCckJXp6l8n52jtwfcdj7IyrvZ+fI /RGHvT+i8n52jtwfcdj7IyrvZ+fI/RGHvT+iJFcjl+Vb4PsjSnJVckm+Bb0/ ohQX46N8C3h/RCkuuif5FvT+iFJcbVyqDwe+P6IUVx0X68NB74+omovtN304 4P0RVXNRPdaHg94fUXn/Ok/uj3js/RGV96/z5P6Ix94fUXn/Ok/uj3js/RGV 96/z5P6Ix94fUXn/Ok/uj6RHNAGFkjew8+QGSQYFkBXDQPE0K4BSyVvYeXKL JIOCx4rl6uLSnMuD75Eoy1XGxTmXh94jUZaL87ecywPvkSjHRfg45/LQeyTK cdVwqT5SrSMKxHH1cLFAUih4CvFchL8pJGMETCKei+2xRDI24DSS9627fl/y Ml5pp6rSxyuIVbwqb1uXANEkELioXudd62IgmmQEr4K3zpvWJUBIRjQgI1lM D85I6tEd3WnkIm9IidR5x7oEh6Zw4PGR96uLcWiKD0CB5N3qEhwUH4D6yHvV xUI3pMfCq9qt81Z1CRDSYxlARpiobklGLCAjTFS3JCN49bp13qcu1rqhfBag RPIudQkOymcBKkQxMd1SfAAKpGZiuqX4ANRH3p9OVdPalZ5DxFSeAULmWHl3 ugSHpnDg8ZH3potxaIoPwBwr70yX4KD4AMyx8r50wVxbfAYRU4WrjrwnXYJC l1HgcWEkjUKXuQBUhtEMijIXgLrI+9DF+jaUnwLMq/ImdAkOyk8B5lWWieOW 4gMwr7JMHLcUH4B5Vd57Lla5KfsqQHXkfecSFGVfBagNx8RwW+YCUBmOieG2 zAWgLvxdDFdUOmWBHze8pmFoCgYgG46EoSk28FIqXQkaBsUGXk6l895yykyF 16WH8XDFKdgND523lkuBaAoIHiN5Z7kEiKYYAVRI3lguBUIxAqgRYUipG8pj GUA+PA2D8lh4mZWWdDS3FBt4qZWWdDS3FBsWkA3HiNxQ3gpQHXkjuRQI5a0A 9aG4iG4pRgAVoriIbilGADWS95NTbirK2x0aeLtD563kYhiaggHIhiFhaIoN wOwqbyYXw6DYAMyt8l5ydTCn0mV1GFxt5I3kUhi6DAOQDcfA0GU2ALWRt5BL YZTZANRG3j8ukrihPBVgZpU3j4thUJ4KMK+ydBS3FBuAWZWlo7il2ADMqfKe cYnETdlTAWojbxeXwih7KkBtOC6K2zIbgNpwXBS3ZTYAtZH3i4sPUjryRChe Va3Om8UlQMgToXg1tTrvFhcD8SQjHpARywAhGcGrpzVVRZ+ldNSZUDyJmEox OKgzoQ6QD0Pj8BQfHpAPz+Cg+ADUh2Aq09Jy2kTpgNW0RjC1aXExbQIErpbW CCaq30ppUzawKmmNZOJ5XEibMoFWR2skU5OWaSMSOaI0JFOVlkgjwoGnDMXE 8kgZMRdgwlBMFE+EEfMAp4u8L1x8jtJR50EBc6q8J1yCgzoPCphT5T3hYhye 4gMwp8r7wiU4KD4Ac6ra0acpXflMKKA6tGBQlM+EAmpD1zQKX+YCUBnaMijK XADqwjD1Z1nrnkjgiPmUYSrQkr49EQ68fMowcTxq2hNzAZZPGSaCJx17Yh7g 8inL1J7lulDAqrBM9VmqCgWrCcvE7lgTClQRjonaqSIUrB5cTR6ZdNTJT8AE ylkaBnXyEzCD8hUJw1NsAKZQXtEwKDYAc6i8t1tyWNJRpz4B1ZH3dkuBUKc+ 8fRh895uCRBPMYKnEJv3dkuBUIx4QEboyrO7dMoCP2ZYQdeeZfmUhX3KsIKO 5klCZUEfMqyg43iWUVnYZwwruWqzVBWxuhFVIbl6s1gXMRA8XUgukt+UkbAB pgzJxfBYGwkTcNrI+7hFRyUddeITL6OyeRu3GAZ14hMwn8q7uEUwPMUGYDaV N3GLYVBsAOZSeQ+35KikK5/4BNRG3sIthVE+8QmojbyDWwLDl9kA1EbewC2F UWYDUBuarjDLnzM08naG1XSNWfqcoXF3M6yho3j8nKFRNzOsoeN3+pyhcfcy rOEqy3JVGGBNWK62LFWFgdWE5aJ3rAoDqgnLxe1UFQZPE9t+9b7sN1N5/Ekq Wr0+G3R9+6p7XLb9uh127/Hqk6F5nPeboT/skuEwWZjh60Sc/2c9t1VPF8XU n36L+PkN4z5QfvU0992Vjwjtzz+0ETz3AV3+Pe9X/W7yNPnxFzeTSqrT+HmF MPusH4Z+/bDvlpclVt31k1/u+sM28PvlYsu8X8+6TbcJN6eWhk+4n/0aaLtZ em+BavTLfJFbMPTbh+VmES8v4+XVJ60uqrp1MwJ/ZoD6Q/DPF8pWVW5BtxnG j1/G69fx+vaTlte1m+maWF7Ey+t4ef1Jy7tZeIbW+fL9YRj1H69u4tX9J61e Vc6Q7O+71bfYApvQL4smNIehfxJff5cp419JBrkdLrHjTzNj2+yHhBEf21F9 sh3zRVWVvcK62Scfx0WIJzvKtOwPs9GM32/Oy0vpYzl/Ue4sSh2l+D+YdEeW SLynUH8KXftVPzxsV00I24ktqSOtP9mWsks52nLYFKxJ3KrQny6o2MWc/jHO EBbYtMHL7S/vDrN1m+1hOL063nVMypr3dve8H5r56Ts2Zi2jped3hTsuv09s mnUblgwaeT7SfxXN+zZ8FcbxEcHx0hnKyaow43GRMOPEf43tPL5d3E8/eqRs 9nFonPW8SnFydz+5vJ98VFPZ9PEKObmo7mdX97PP++223WXznwZ/Zn5YQN6v UadrLHfb5zr/bA6z/bBrTh97iKztbkMukk+v0+n/cXw3af5PJtf35pt7880n mm8/0/z63nx3b777RPN9Nv2qnzWr53N2kq0z6w+bRbN7Jyc30fj2EHL1/Tjn IYj5pNWr4DJBn1x6+Zt7ujYuefsUy/L4OlEFbYviUgUJ3hbiVSgKi8jiIowT uS1WXMQW1lDFNUp+8DY57wpFQewiU/t23c5fs/nHIXpSVfwSbO+/BJnwD//1 SvV/8HU7RZnwtu189rDbLB7Cg+/Lw/fTt2LMw7+3u9923SWVCCOLNjwWbM62 De3b8PwSnpWfu0WYu7oN7ufNalxOVKfB713zfP1tIIzL6Zi8TNbr69XFrlsF VS2fX/vjO5WY6nBDt7pNGk9QnQFv2mR4/NXh9q7xcfi526/a52bXNuOy1flv enr/9deB47XorRca2kU39JffAZa7brEPUN/C3fV1ZHyrjlc9jj4fNt0QLkXz 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 H4sICBLIT1wCA3N1YmMyNTYubGh0AM1dXY/jthV9n19hoMhTMYbEb87CD03R Fn0LWqQo+jKQbY1XiccyZHkzk8X891L+JGVecrOZJGcedsf6IO/R0bn30iTv fKwetov5fbdZ3s/bqlvef1KTz3d3k4/VQ9X3XTPf9/XOHZlMJp+/++u3Dw+r rlk+POw3Tf82e27Wd5M3d/W6edj1r+vzle7mfzerTbU+fpwsm+q57utuMpuw afH8fDjY1y/9425RrWt3uLge6j82ix+HQ9PTweHzpt7t3LHSHTx0OnTSHu7k 5VSeDy3WddVVm8VwnF0vfTvZ9F37k7MhYhL7FSaxW5PKC8aMQX+v+ltzSq6n 5tzi11hkbi0SespE9CnJG6Mcc/d9s/oYMU2Ja8u/MX0l8w17O76Rzo7q8obt mp/rk4n9x7p7rtZXc6ayGH4OJ18OrekLJ6/h5zPs4b0+NbfbVotmswofz6R9 eto9vnjIDgderweudi6rk51OF9tqueurxY+P267t2/51exLJcOnhgnb+Q73o T8o5ItvPF9PSMns+FlPj8NPVT8t6N/ueSXU69HZp5GLD+Sdhy+RsTtSic6PD qXX1Wne7g4e4WNa32/tds/I6WzfLWXH55C5ZtM/zZjM808/no5cO432eblw3 m9o9Cl4EJyYv5UycuPkweS1nXJ8/vLCZkMX5DPPOXF7EWXk+f3nhZsVUFVYV zhF88PtxFjytq1Vo1ulFHUyblf7xt7v47x4OnsZx/TDGcT0DgUNlcJB8CCw+ bBqHJPmQUHwIdoPDeUBCH1fT4fQhZBpHoI8AB5Y+hMngIPnA0ocs0zgkyQeW PqTI6Jz0VxKLD53GoUh/paD4UJl4rkg+FBQfKhPPNcmHxuJDZXRO+issfSib xqFIf4WlD52J54rkA0sfOhPPNckHlj50JJ5ravyhCtjxhynTOIL8KsCBlV8Z kcFB8oGVXxmdxiFJPrDyK3sbz5Wkxh9XFwWnD8vTOEJ9aNjxh1UZHCQfWPqw No1Dknwg6YMVBcvonPRXSPmVwyHTOBTprxQWH5l4rkg+FBQfZSaea5IPDcVH KTI6J/0Vlj5KncahSH+FpQ+WieeK5ANLHywTzzXJB5Y+2G081+T8h0ad/3A4 bBpHkF9p1PkPVnCWwUHyIaD44DKNQ5J8YOVX/DaeG3L+w6DOf7BClGkcgT4M 6vyHwyEyOEg+sPQhdBqHJPnA0ocsMjon/RVWfiV5Goci/RVWfiUz8VyRfGDl VzITzzXJB1Z+pVhG56S/wtKHkmkcivRXWPpQmXiuSD6w9KEz8VyTfGDpQ0fi OTn/YQvY8YfWaRxBfmUL2PGHKTI4SD6w8ivD0zgkyQdWfmVu47kl5z+shh1/ GJvGEepDw44/LMvgIPnA0oeVaRyS5ANLH9ZkdE76K6j8qizKNA5F+iuo/Kos MvFckXwoLD4y8VyTfEDlV2VZZHRO+issfZQ8jUOR/gpLH2UmniuSDyx9lJl4 rkk+sPTBWGadJbleVEPxwWQahyHXixosPkwGB8mHgeKDl2kcluTDQvHBRWad JbleFEsfXKdxGHK9KJY+RJHBQfKBpQ/B0zgsyQeWPkRmv5ol/ZXF4iOzX42p acGlM+IGx/UMAg6ZiedMT3kRx3E5A4EjE8/LqQv5zeYWxuUEBIrMbjVLeiss dajMbrVAHQEOLHWoTDQP1BHigFKHykRzXx0BDCh16CKzxpJcK4qVW2mexmHI taJYuZVWGRwkH1i5lbZpHJbkAyu3MiyzxpJcK4qlDyPTOAy5VhRLH8ZkcJB8 YOnDlmkcluQDSx82s1fNkv4KK7uymb1qQXYV4IDKrliRiedBdhXiQMquWJGJ 5352FcBAyq5YkdmpZklvBaUOVmR2qoXq0KhjD1ZmonmoDo069nCD2jSOQB0a dOzhgnlmfSW5ThQqt3JA0jgMuU4UKrdiTGRwkHwYLD50Gocl+YDKrVikLpwh 5z0M7LwHi9SFM+S8h4Gd92CRunCGnPcwsPMeLFIXzpDzHgZ23oOJzD41S/or rOxKZPapBdmVhp33YCITz4PsSsPOezCZied+dqVR5z2YzOxSs6S3wlKHzOxS C9RhYOc9mMpE80AdBnbeg6lMNPfVYVDnPVikJpwh5z0s7LwHi9SEM+S8h4Wd 92CRmnCGnPewsPMeLFITzpDzHhZ23oNFasJZct7Dws57sEhNOEvOe1jYeQ8W qQlnyXkPCzvvwSI14Sw572Fh5z2YzexRs6S/wsqubGaPWpBdWdx5D5uJ50F2 ZXHnPWwmnvvZlUWd9+BFZoeaJb0VlDp4kdmhFqoDdt6DF5loHqoDdt6Dl5lo HqgDdd6DR+rBXV+X8X5ad0bpwwmw7bQ8Ug4ugBFsp/VhQO2m5ZFqcCEMig2o zbQ8UgwugCEpNiQWG7dx3Gl3UO5YGBdJwwkjUgfuiiFQhY8BSxWRGnAeBooH LElE6r9dMUiKByw9RGq/hbKmvBPU1lkeKf0WwFCUd4LaOctFJnIrig2FxUYm cmuKDah9szxS983TN+WjsIQRqfl2xaAoH4WlCpmK2YriAUsSMhWzNcUDlh5U NGZrGcueeDEVBnJYoWQSRZA/+Siw8qdIjbcABcUFVgYVqfDmo5AUF1g5VKS+ Gy+nOjrcLqdMY44qItXdfBSjccUVBZYuIrXdAhQUF1i6iFR281FIigssXRiV Vjflo7AyKGOTKBTlo7ByKJuO3YriAiuLsunYrSkusPKoSD23QN2Uj4LShYhU c/NRKMpHQelCFOnYrSguFBYX6ditKS6gdCEiddw4nypJJFIcMo8SkSpuAYpR IsUh8ygRqeEWoiC4EFhc2DQKSXABlUcJFovdIjrqVsOfOUYcdgsmEyDCQbcP AksVzKRAkExgiYKXCRCSZAJLE5GabaGyCf+ElUNFKrYFKBThn7ByKJGJ24rg AiuHEpm4rQkusHIooVLiJj0UliyETYBQpIfCUoVMRW1FMoElCpmK2ppkAksT kQptXE+Fio4ruJmWkAlUpD5bgCLMoa4osDKoSHW2EAXBBVYKFanNFqCQBBdY OZSOzW/L6HSecEYWmAMLzVMoAlUEKLB0oVUSBckFli60TaGQJBdYuojUZAvV TfgorCQqUpEtQKEIH4WVRZlM7FYEF1hplM3Ebk1wgZVHRWqx+eomfRSWLiKV 2DwUivRRULqQRTJ2K5ILKF3IIhm7NcmFxuJCZZY7Uqs2NRYZNg3DUKs2oXay ykgNthAGxQbURlYZKcEWwLAUGxaLDZNa90it3cQSBisTGAy1dhNLFUykMFA8 YEmC6QQGS/GApQee2Q1mKe8EtXFV8sxusGDjqg8Dat+q5JnIHexbDWAgbVuV PBO5/W2rPgqkXatSpHaEWcpDYclCpHaEBZrwMWBpQqQidiCIAAOUIGQqYvtq 8CFAqUGK9EpHar0mVuYkdRKFodZrYuVOqkijoLjAyp4UT6KwFBdY+VOkrlqw 0pFar4mli0hVNR+FodZrYukiUlMtQEFxgaWLSEU1H4WluMDShU7vB7OUj8LK n0x6P1iQQfkosDIok47dQQ4VoIDKoUw6dvtZlA8CKouy6d1glvJQWKqw6d1g 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