Unverified Commit bbfaf622 authored by Sam Wang's avatar Sam Wang Committed by GitHub

Reuse the BufferedImage in SwingOffscreenRenderer (#996)

Fix for
https://youtrack.jetbrains.com/issue/CMP-6722/Excessive-garbage-generation-from-redrawing

Previously, the `draw` method would allocate a `BufferedImage` on every
redraw, which is wasteful. This fix changed `SwingOffscreenRenderer` to
reuse the same instance of `BufferedImage` and only clear it on redraws.
Only changing the draw size would allocate a new `BufferedImage`.
parent b73b3744
...@@ -15,6 +15,8 @@ internal class SwingOffscreenDrawer( ...@@ -15,6 +15,8 @@ internal class SwingOffscreenDrawer(
) { ) {
@Volatile @Volatile
private var volatileImage: VolatileImage? = null private var volatileImage: VolatileImage? = null
private var bufferedImage: BufferedImage? = null
private var bufferedImageGraphics: Graphics2D? = null
/** /**
* Draws rendered image that is represented by [bytes] on [g]. * Draws rendered image that is represented by [bytes] on [g].
...@@ -56,7 +58,15 @@ internal class SwingOffscreenDrawer( ...@@ -56,7 +58,15 @@ internal class SwingOffscreenDrawer(
dirtyRectangles: List<Rectangle> dirtyRectangles: List<Rectangle>
): BufferedImage { ): BufferedImage {
val src = ByteBuffer.wrap(bytes) val src = ByteBuffer.wrap(bytes)
val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE) if (bufferedImage == null || bufferedImage?.width != width || bufferedImage?.height != height) {
bufferedImage?.flush()
bufferedImage = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE)
bufferedImageGraphics = bufferedImage?.createGraphics()
} else {
bufferedImageGraphics?.clearRect(0,0, width, height)
}
val image = bufferedImage!!
val dstData = (image.raster.dataBuffer as DataBufferInt).data val dstData = (image.raster.dataBuffer as DataBufferInt).data
val srcData: IntBuffer = src.order(ByteOrder.LITTLE_ENDIAN).asIntBuffer() val srcData: IntBuffer = src.order(ByteOrder.LITTLE_ENDIAN).asIntBuffer()
for (rect in dirtyRectangles) { for (rect in dirtyRectangles) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment