Jim,<br><br>First, here are both updated webrev and benchmark results:<br>- results: <a href="http://jmmc.fr/~bourgesl/share/java2d-pisces/patch_opt_night.log">http://jmmc.fr/~bourgesl/share/java2d-pisces/patch_opt_night.log</a><br>
- webrev: <a href="http://jmmc.fr/~bourgesl/share/java2d-pisces/webrev-2/">http://jmmc.fr/~bourgesl/share/java2d-pisces/webrev-2/</a><br><br>Note: the webrev is partially "cleaner" - work still in progress !<br>
<br>Changes made:<br>- optimized cleanup of alpha / edges arrays<br>- TileState HARD reference stored in SunGraphics2D to avoid repeated ThreadLocal or ConcurrentQueue accesses<br>- TileState propagated in RenderingEngine to PiscesRenderingEngine: warning: interface compatibility issues<br>
- minor tuning.<br><br>Now the ArrayCache (IntArrayCache, Dirty... and FloatArrayCache) are totally useless during MapBench tests as the RendererContext stores large arrays (16K int or float arrays) + rowAARLE (2Mb).<br>However, I keep the array caching for very high workload ... to be discussed later.<br>
<br>Comparison (open office format):<br><a href="http://jmmc.fr/~bourgesl/share/java2d-pisces/compareRef_Patch.ods">http://jmmc.fr/~bourgesl/share/java2d-pisces/compareRef_Patch.ods</a><br><br>Patch2 vs ductus:<br>



        
        
        
        
        <style>body, div, table, thead, tbody, tfoot, tr, th, td, p { font-family: "Liberation Sans"; font-size: x-small; }</style>
        

<table border="0" cellspacing="0" cols="2" frame="VOID" rules="NONE">
        <colgroup><col width="126"><col width="126"></colgroup>
        <tbody>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" width="126" align="RIGHT">1</td>
                        <td style="border:1px solid rgb(0,0,0)" width="126" align="RIGHT"><b>102,11%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="RIGHT">2</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>144,49%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="RIGHT">4</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>263,13%</b></td>
                </tr>
        </tbody>
</table>
<br>In average, patch2 is equal or better than ductus: 44% for 2 threads and 2.6 times for 4 threads !<br><br>In the following table, you can see gain variations depending on the test (work load): my patch performs better than ductus for complex test case only.<br>
<br>



        
        
        
        
        <style>body, div, table, thead, tbody, tfoot, tr, th, td, p { font-family: "Liberation Sans"; font-size: x-small; }</style>
        

<table border="0" cellspacing="0" cols="5" frame="VOID" rules="NONE">
        <colgroup><col width="165"><col width="84"><col width="94"><col width="94"><col width="131"></colgroup>
        <tbody>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" width="165" align="LEFT">test</td>
                        <td style="border:1px solid rgb(0,0,0)" width="84" align="LEFT">threads</td>
                        <td style="border:1px solid rgb(0,0,0)" width="94" align="LEFT">Tavg</td>
                        <td style="border:1px solid rgb(0,0,0)" width="94" align="LEFT">Tmed</td>
                        <td style="border:1px solid rgb(0,0,0)" width="131" align="LEFT"><b>Med+Stddev</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="LEFT">boulder_17</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">1</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">82,54%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">77,68%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>76,99%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="LEFT">boulder_17</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">2</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">119,57%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">120,24%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>128,56%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="LEFT">boulder_17</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">4</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">149,95%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">150,39%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>161,98%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="LEFT">shp_alllayers_47</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">1</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">107,26%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">107,18%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>107,02%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="LEFT">shp_alllayers_47</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">2</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">144,24%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">144,18%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>147,00%</b></td>
                </tr>
                <tr>
                        <td style="border:1px solid rgb(0,0,0)" height="24" align="LEFT">shp_alllayers_47</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">4</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">288,05%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT">289,10%</td>
                        <td style="border:1px solid rgb(0,0,0)" align="RIGHT"><b>286,04%</b></td>
                </tr>
        </tbody>
</table>
<br>Secondly, here are my comments:<br><br><div class="gmail_quote">2013/4/24 Jim Graham <span dir="ltr"><<a href="mailto:james.graham@oracle.com" target="_blank">james.graham@oracle.com</a>></span><br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Originally the version that was used in embedded used RLE because it stored the results in the shape itself.  On desktop I never found that to be a necessary optimization especially because it actually wastes memory for no gain during animations, but that was why they used RLE as a storage format.  Would it speed up the code to use a different storage format?<br>
</blockquote><div><br>Maybe it could be a very good idea: compressing alpha array to RLE and then decompressing it to fill byte[] tile array seems a bad idea. However, keeping RLE encoding may help having smaller arrays to store a complete tile line as I want: width = 4096 (or more) x height = 32.<br>
<br>As memory is cheap nowadays, I could try having a large 1D array to store alpha values for complete tile line: 512K only !<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


Also, in the version we use in JavaFX we removed the tiling altogether and return one alpha array for the entire rasterization.  We might consider doing that for this code as well if it allows us to get rid of Ductus - it was a Ductus design constraint that forced the tiling (it was again based on the expected size of the hardware AA engine)...<br>
</blockquote><div><br>I think tiling is still interesting as such small arrays stay in the cpu cache ! however, I could try tuning the tile width to be larger (256x32) instead of (32x32 tiles) ... <br><br><br>Finally,<br>
Who could help me working on pisces ? Could we form a tiger team ? <br>or at least could denis and you have some time to help me ?<br><br>Laurent<br></div></div>