<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Yes, I confirm that we’ve been using such enlarged buffer for a long time in production. It helped us with scrolling performance on 4K monitors. The suggested property could help to adjust the buffer for the needs of particular application.<div class=""><br class=""></div><div class="">Best Regards,</div><div class="">Alexey<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 7 Dec 2022, at 11:37, Laurent Bourgès <<a href="mailto:bourges.laurent@gmail.com" class="">bourges.laurent@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="auto" class="">Hi,<div dir="auto" class=""><br class=""><div dir="auto" class="">For years, JetBrains Runtime uses a larger render queue buffer size (32kb to 6,400,000 bytes) in production, as it boosted many accelerated pipelines: d3d, ogl, metal :</div><div dir="auto" class="">~ 10 to 20% on large fills...</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">JBR RenderQueue:</div><div dir="auto" class=""><a href="https://github.com/JetBrains/JetBrainsRuntime/blob/02bc54f8644c6c6467aa952d0a8a104355acc273/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75" class="">https://github.com/JetBrains/JetBrainsRuntime/blob/02bc54f8644c6c6467aa952d0a8a104355acc273/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75</a><br class=""></div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">JDK RenderQueue:</div><div dir="auto" class=""><a href="https://github.com/bourgesl/jdk-official/blob/5e196b4b8e623107424e2fb54672790fd925fe73/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75" class="">https://github.com/bourgesl/jdk-official/blob/5e196b4b8e623107424e2fb54672790fd925fe73/src/java.desktop/share/classes/sun/java2d/pipe/RenderQueue.java#L75</a><br class=""></div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">I want to propose such quick fix in openjdk20 today, as a 1-line fix.</div><div dir="auto" class=""><br class=""></div><div dir="auto" class=""><table class=""><tbody class=""><tr class=""><td class="">
</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">    /** The size of the underlying buffer, in bytes. */</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">    private static final int BUFFER_SIZE = 6400000;</td></tr><tr class=""></tr></tbody></table></div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">To ensure a smooth transition, I prefer introducing a new sun.java2d.render.queue system property to increase the default (32kb) buffer capacity:</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">See in marlin:</div><div dir="auto" class=""><a href="https://github.com/bourgesl/marlin-renderer/blob/323f1fb1c72704f5e86c8a13393e30df00888821/src/main/java/sun/java2d/pipe/RenderQueue.java#L78" class="">https://github.com/bourgesl/marlin-renderer/blob/323f1fb1c72704f5e86c8a13393e30df00888821/src/main/java/sun/java2d/pipe/RenderQueue.java#L78</a><br class=""></div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">So here is my current proposal:</div><div dir="auto" class="">[[[</div><div dir="auto" class=""><table class=""><tbody class=""><tr class=""><td class="">
</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">    /** The size of the underlying buffer, in bytes. */</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">    private static final int BUFFER_SIZE;</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">
</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">    static {</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">        // Default 32K is too small for high-end GPU:</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">        BUFFER_SIZE = align(getInteger("sun.java2d.render.bufferSize", 32 * 1024, 32 * 1024, 16 * 1024 * 1024), 1024);</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">
</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">// System.out.println("RenderQueue: sun.java2d.render.bufferSize = " + BUFFER_SIZE);</td></tr><tr class=""></tr></tbody></table><table class=""><tbody class=""><tr class=""><td class="">    }</td></tr><tr class=""></tr></tbody></table></div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">    // system property utilities</div><div dir="auto" class="">    public static int getInteger(final String key, final int def,</div><div dir="auto" class="">                                 final int min, final int max)</div><div dir="auto" class="">    {</div><div dir="auto" class="">        final String property = AccessController.doPrivileged(</div><div dir="auto" class="">                                    new GetPropertyAction(key));</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">        int value = def;</div><div dir="auto" class="">        if (property != null) {</div><div dir="auto" class="">            try {</div><div dir="auto" class="">                value = Integer.decode(property);</div><div dir="auto" class="">            } catch (NumberFormatException e) {</div><div dir="auto" class="">                System.out.println("Invalid integer value for " + key + " = " + property);</div><div dir="auto" class="">            }</div><div dir="auto" class="">        }</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">        // check for invalid values</div><div dir="auto" class="">        if ((value < min) || (value > max)) {</div><div dir="auto" class="">            System.out.println("Invalid value for " + key + " = " + value</div><div dir="auto" class="">                    + "; expected value in range[" + min + ", " + max + "] !");</div><div dir="auto" class="">            value = def;</div><div dir="auto" class="">        }</div><div dir="auto" class="">        return value;</div><div dir="auto" class="">    }</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">    protected static int align(final int val, final int norm) {</div><div dir="auto" class="">        final int ceil = (int)Math.ceil( ((float) val) / norm);</div><div dir="auto" class="">        return ceil * norm;</div><div dir="auto" class="">    }</div><div dir="auto" class="">]]]</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">Would you accept such late change for openjdk20 ?</div><div dir="auto" class=""><br class=""></div><div dir="auto" class="">Cheers,</div><div dir="auto" class="">Laurent Bourgès </div></div></div>
</div></blockquote></div><br class=""></div></body></html>