RFR: 8238954: Improve performance of tiled snapshot rendering [v5]

Kevin Rushforth kcr at openjdk.java.net
Mon Jun 29 21:06:37 UTC 2020

On Mon, 29 Jun 2020 16:41:53 GMT, Frederic Thevenet <github.com+7450507+fthevenet at openjdk.org> wrote:

>> I have changed the test setup to fill up the scene with a gradient instead of random noise; it should be as able to
>> catch misalignment, while not looking like something's gone horribly wrong.
> Also, while running the tests again on a ubuntu 20.04 VM, I encountered 2 occurences where one of the tests failed, out
> of ~8 runs in total. In one case, the error where similar to yours:
>> Task :systemTests:test
> test.javafx.scene.Snapshot2Test > testSnapshot2x2TilesSameSizeImm[3] FAILED
>     java.lang.IllegalArgumentException: Unrecognized image loader: null
>         at javafx.graphics/javafx.scene.image.WritableImage.loadTkImage(WritableImage.java:278)
>         at javafx.graphics/javafx.scene.image.WritableImage$1.loadTkImage(WritableImage.java:53)
>         at javafx.graphics/javafx.scene.Scene.doSnapshot(Scene.java:1342)
>         at javafx.graphics/javafx.scene.Node.doSnapshot(Node.java:2136)
>         at javafx.graphics/javafx.scene.Node.snapshot(Node.java:2214)
>         at test.javafx.scene.Snapshot2Test.lambda$doTestTiledSnapshotImm$12(Snapshot2Test.java:375)
> 148 tests completed, 1 failed
> While in the other, it pointed to an Out Of Memory Error:
>  Task :systemTests:test
> test.javafx.scene.Snapshot2Test > testSnapshot2x2TilesSameHeightDefer[3] FAILED
>     java.lang.OutOfMemoryError: Java heap space
>         at java.base/java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:63)
>         at java.base/java.nio.ByteBuffer.allocate(ByteBuffer.java:351)
>         at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.createPlatformImage(QuantumToolkit.java:1426)
>         at javafx.graphics/javafx.scene.image.Image.<init>(Image.java:740)
>         at javafx.graphics/javafx.scene.image.WritableImage.<init>(WritableImage.java:77)
>         at test.javafx.scene.Snapshot2Test.doTestTiledSnapshotDefer(Snapshot2Test.java:377)
>         at test.javafx.scene.Snapshot2Test.testSnapshot2x2TilesSameHeightDefer(Snapshot2Test.java:489)
> 148 tests completed, 1 failed
> Again, in my environment, it only failed one test, and not all the time, but this could be the same root cause. Two
> ways we could find out would be by either increasing the max heap size for the test runner or use a smaller image and
> force the prism.maxTextureSize property to something less than 4096 to trigger tiling anyway. Unfortunately, I could
> not find out how to achieve either of these (simply passing the properties to the JVM running the Gradle wrapper seem
> to have no effect).

It runs fine for me on Ubuntu 20.04 (VM) and Windows 10.

I also see the failures on macOS. This isn't related to heap size. The failures are consistent, and hit virtually all
of the tests whose dimensions are larger than 4096. Also, I modified the test to `@Ignore` all but one of the failing
tests, and that test still fails.

I instrumented the code, and from one of the failing tests I see this:

    renderToImage: need to tile image, size = 18000 x 90
    renderTile: 4096 x 90
    renderTile: 4096 x 90
    renderTile: 4096 x 90
    renderTile: 4096 x 90
    renderTile: 1616 x 90
    renderTile: 4096 x 0

This last tile is an illegal tile size (so you're probably just getting lucky that it isn't causing problems on Windows
or Linux). I would check the tiling logic.


PR: https://git.openjdk.java.net/jfx/pull/112

More information about the openjfx-dev mailing list