From cc57842d34fc7871df9e616d838a8b2a494a198e Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 19 Feb 2024 14:42:24 -0800 Subject: [PATCH 1/3] [Android] ArrayList is faster than LinkedList for reasonable N. --- .../engine/renderer/FlutterRenderer.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index a5bc96401f7f1..4de94039c1ceb 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -30,7 +30,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; @@ -433,7 +432,7 @@ final class ImageReaderSurfaceProducer private Object lock = new Object(); // REQUIRED: The following fields must only be accessed when lock is held. - private final LinkedList imageReaderQueue = new LinkedList(); + private final ArrayList imageReaderQueue = new ArrayList(); private final HashMap perImageReaders = new HashMap(); private PerImageReader lastReaderDequeuedFrom = null; @@ -452,7 +451,7 @@ public PerImage(Image image, long queuedTime) { /** Internal class: state held per ImageReader. */ private class PerImageReader { public final ImageReader reader; - private final LinkedList imageQueue = new LinkedList(); + private final ArrayList imageQueue = new ArrayList(); private boolean closed = false; private final ImageReader.OnImageAvailableListener onImageAvailableListener = @@ -485,7 +484,7 @@ PerImage queueImage(Image image) { imageQueue.add(perImage); // If we fall too far behind we will skip some frames. while (imageQueue.size() > 2) { - PerImage r = imageQueue.removeFirst(); + PerImage r = imageQueue.remove(0); r.image.close(); } return perImage; @@ -495,7 +494,7 @@ PerImage dequeueImage() { if (imageQueue.size() == 0) { return null; } - PerImage r = imageQueue.removeFirst(); + PerImage r = imageQueue.remove(0); return r; } @@ -535,12 +534,12 @@ void pruneImageReaderQueue() { } // Prune nodes from the head of the ImageReader queue. while (imageReaderQueue.size() > 1) { - PerImageReader r = imageReaderQueue.peekFirst(); + PerImageReader r = imageReaderQueue.get(0); if (!r.canPrune()) { // No more ImageReaders can be pruned this round. break; } - imageReaderQueue.removeFirst(); + imageReaderQueue.remove(0); perImageReaders.remove(r.reader); r.close(); } @@ -580,7 +579,8 @@ void onImage(ImageReader reader, Image image) { PerImage dequeueImage() { PerImage r = null; synchronized (lock) { - for (PerImageReader reader : imageReaderQueue) { + for (int i = 0; i < imageReaderQueue.size(); i++) { + PerImageReader reader = imageReaderQueue.get(i); r = reader.dequeueImage(); if (r == null) { // This reader is probably about to get pruned. @@ -618,8 +618,8 @@ PerImage dequeueImage() { private void releaseInternal() { released = true; - for (PerImageReader pir : perImageReaders.values()) { - pir.close(); + for (int i = 0; i < perImageReaders.size(); i++) { + perImageReaders.get(i).close(); } perImageReaders.clear(); imageReaderQueue.clear(); @@ -735,7 +735,7 @@ private PerImageReader getActiveReader() { // Create a new ImageReader and add it to the queue. return getOrCreatePerImageReader(createImageReader()); } - return imageReaderQueue.peekLast(); + return imageReaderQueue.get(imageReaderQueue.size() - 1); } } @@ -809,8 +809,8 @@ public int numImageReaders() { public int numImages() { int r = 0; synchronized (lock) { - for (PerImageReader reader : imageReaderQueue) { - r += reader.imageQueue.size(); + for (int i = 0; i < imageReaderQueue.size(); i++) { + r += imageReaderQueue.get(i).imageQueue.size(); } } return r; From 9087605b3c4bfe77cd86c4e9b131071b1f174bf8 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 20 Feb 2024 09:02:53 -0800 Subject: [PATCH 2/3] add missing nullcheck. --- .../io/flutter/embedding/engine/renderer/FlutterRenderer.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index 4de94039c1ceb..4fb2b9b3ebc85 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -735,6 +735,9 @@ private PerImageReader getActiveReader() { // Create a new ImageReader and add it to the queue. return getOrCreatePerImageReader(createImageReader()); } + if (imageReaderQueue.size() == 0) { + return null; + } return imageReaderQueue.get(imageReaderQueue.size() - 1); } } From 3e03d3f31fc29a9edbe55371a95a47bf6b26ee9e Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Tue, 20 Feb 2024 10:22:56 -0800 Subject: [PATCH 3/3] Add nullcheck? --- .../flutter/embedding/engine/renderer/FlutterRenderer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index 4fb2b9b3ebc85..f9fcf975c8616 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -619,7 +619,10 @@ PerImage dequeueImage() { private void releaseInternal() { released = true; for (int i = 0; i < perImageReaders.size(); i++) { - perImageReaders.get(i).close(); + PerImageReader reader = perImageReaders.get(i); + if (reader != null) { + reader.close(); + } } perImageReaders.clear(); imageReaderQueue.clear();