Skip to content

Commit 10aee2f

Browse files
authored
Merge pull request #7 from t-34400/feature/optimize-webview-performance
Optimize WebView Performance
2 parents ff1435d + 3fcc21f commit 10aee2f

2 files changed

Lines changed: 45 additions & 40 deletions

File tree

Plugins/Android/WebViewManager.java

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ public interface WebViewUrlChangeListener {
4343
public final int webViewHeight;
4444
public final int outputWidth;
4545
public final int outputHeight;
46+
public final long intervalMSec;
47+
48+
private final WebViewBitmapListener bitmapListener;
4649

4750
private ImageReader imageReader;
4851
private VirtualDisplay virtualDisplay;
@@ -56,45 +59,25 @@ public interface WebViewUrlChangeListener {
5659
private boolean isRunning = true;
5760
private long downTime = 0;
5861

59-
public WebViewManager(Activity activity, int _webViewWidth, int _webViewHeight, int _outputWidth, int _outputHeight, long intervalMSec,
62+
public WebViewManager(Activity activity, int webViewWidth, int webViewHeight, int outputWidth, int outputHeight, long intervalMSec,
6063
WebViewBitmapListener bitmapListener,
6164
WebViewUrlChangeListener urlListener,
6265
WebAppInterface.WebViewDataListener webViewDataListener,
6366
ViewGroup rootView, View defaultFocusView)
6467
{
65-
webViewWidth = _webViewWidth;
66-
webViewHeight = _webViewHeight;
67-
outputWidth = _outputWidth;
68-
outputHeight = _outputHeight;
68+
this.webViewWidth = webViewWidth;
69+
this.webViewHeight = webViewHeight;
70+
this.outputWidth = outputWidth;
71+
this.outputHeight = outputHeight;
72+
this.intervalMSec = intervalMSec;
73+
this.bitmapListener = bitmapListener;
6974

7075
mainHandler = new Handler(activity.getMainLooper());
7176

7277
activity.runOnUiThread( () -> {
7378
WebView.enableSlowWholeDocumentDraw();
7479

7580
imageReader = ImageReader.newInstance(outputWidth, outputHeight, PixelFormat.RGBA_8888, 2);
76-
imageReader.setOnImageAvailableListener(imageReader -> {
77-
synchronized (this)
78-
{
79-
if (!isRunning)
80-
{
81-
return;
82-
}
83-
}
84-
85-
Image image = imageReader.acquireNextImage();
86-
87-
Bitmap bitmap = convertToBitmap(image);
88-
89-
image.close();
90-
91-
ByteArrayOutputStream stream = new ByteArrayOutputStream();
92-
if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream))
93-
{
94-
byte[] bitmapArray = stream.toByteArray();
95-
bitmapListener.onWebViewUpdated(bitmapArray);
96-
}
97-
}, mainHandler);
9881

9982
DisplayManager displayManager = (DisplayManager)activity.getSystemService(Context.DISPLAY_SERVICE);
10083

@@ -166,33 +149,25 @@ public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
166149
});
167150

168151
presentation.show();
152+
mainHandler.post(() -> sendWebViewBitmapIfNeeded());
169153
});
170154
}
171155

172156
public void onDestroy() {
157+
isRunning = false;
173158
virtualDisplay.release();
174159
presentation.dismiss();
175160
imageReader.close();
176161
webAppInterface.onDestroy();
177162
}
178163

179-
public void onResume() {
180-
// Ensure ImageReader resumes receiving new images after the activity resumes from sleep mode.
181-
mainHandler.post( () -> {
182-
Image image = imageReader.acquireNextImage();
183-
if (image != null) {
184-
image.close();
185-
}
186-
});
187-
startUpdate();
188-
}
189-
190164
public void startUpdate() {
191165
synchronized (this) {
192166
if (!isRunning) {
193167
isRunning = true;
194168
}
195169
}
170+
mainHandler.post(() -> sendWebViewBitmapIfNeeded());
196171
}
197172

198173
public void stopUpdate() {
@@ -296,6 +271,33 @@ public WebBackForwardList restoreState (Bundle inState) {
296271
return webBackForwardList;
297272
}
298273

274+
private void sendWebViewBitmapIfNeeded () {
275+
synchronized (this)
276+
{
277+
if (!isRunning)
278+
{
279+
return;
280+
}
281+
}
282+
283+
Image image = imageReader.acquireNextImage();
284+
285+
if (image != null) {
286+
Bitmap bitmap = convertToBitmap(image);
287+
288+
image.close();
289+
290+
ByteArrayOutputStream stream = new ByteArrayOutputStream();
291+
if(bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream))
292+
{
293+
byte[] bitmapArray = stream.toByteArray();
294+
bitmapListener.onWebViewUpdated(bitmapArray);
295+
}
296+
}
297+
298+
mainHandler.postDelayed(() -> sendWebViewBitmapIfNeeded(), intervalMSec);
299+
}
300+
299301
private static Bitmap convertToBitmap(Image image) {
300302
Image.Plane[] planes = image.getPlanes();
301303

Plugins/Android/WebViewUnityPlayerActivity.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class WebViewUnityPlayerActivity extends UnityPlayerActivity
3232
private static final String WEBVIEW_HEIGHT_BUNDLE_KEY_FORMAT = "WebViewHeight_%d";
3333
private static final String OUTPUT_WIDTH_BUNDLE_KEY_FORMAT = "OutputWidth_%d";
3434
private static final String OUTPUT_HEIGHT_BUNDLE_KEY_FORMAT = "OutputHeight_%d";
35+
private static final String INTERVAL_BUNDLE_KEY_FORMAT = "Interval_%d";
3536

3637
public static WebViewUnityPlayerActivity currentWebViewActivity;
3738

@@ -55,8 +56,9 @@ public void onCreate(Bundle savedInstanceState) {
5556
int webViewHeight = savedInstanceState.getInt(String.format(WEBVIEW_HEIGHT_BUNDLE_KEY_FORMAT, index));
5657
int outputWidth = savedInstanceState.getInt(String.format(OUTPUT_WIDTH_BUNDLE_KEY_FORMAT, index));
5758
int outputHeight = savedInstanceState.getInt(String.format(OUTPUT_HEIGHT_BUNDLE_KEY_FORMAT, index));
59+
long intervalMSec = savedInstanceState.getLong(String.format(INTERVAL_BUNDLE_KEY_FORMAT, index));
5860

59-
generateWebViewTextureProvider(gameObjectName, webViewWidth, webViewHeight, outputWidth, outputHeight, 100L);
61+
generateWebViewTextureProvider(gameObjectName, webViewWidth, webViewHeight, outputWidth, outputHeight, intervalMSec);
6062
}
6163

6264
if(webViewManagers.size() == 1) {
@@ -91,7 +93,7 @@ public void onResume() {
9193
super.onResume();
9294
Log.i("WebView", "onResume()");
9395
webViewManagers.forEach( (gameObjectName, webViewManager) -> {
94-
webViewManager.onResume();
96+
webViewManager.startUpdate();
9597
});
9698
}
9799

@@ -117,6 +119,7 @@ protected void onSaveInstanceState(Bundle outState) {
117119
outState.putInt(String.format(WEBVIEW_HEIGHT_BUNDLE_KEY_FORMAT, index), webViewManager.webViewHeight);
118120
outState.putInt(String.format(OUTPUT_WIDTH_BUNDLE_KEY_FORMAT, index), webViewManager.outputWidth);
119121
outState.putInt(String.format(OUTPUT_HEIGHT_BUNDLE_KEY_FORMAT, index), webViewManager.outputHeight);
122+
outState.putLong(String.format(INTERVAL_BUNDLE_KEY_FORMAT, index), webViewManager.outputHeight);
120123
++index;
121124
}
122125
}

0 commit comments

Comments
 (0)