From 15a47d116a0fc15d249b37574fcd932ce88909df Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Mon, 11 Sep 2017 11:04:53 +0300 Subject: [android] schedule work on the gl thread using GLSurfaceView#queueEvent --- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 12 ++---- .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 44 ++++++++++++++++++---- .../maps/renderer/GlSurfaceViewRenderThread.java | 25 ++++++++++++ .../mapboxsdk/maps/renderer/RenderThread.java | 12 ++++++ 4 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/GlSurfaceViewRenderThread.java create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/RenderThread.java (limited to 'platform/android/MapboxGLAndroidSDK') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index a920bed720..086f57abf6 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -28,6 +28,7 @@ import com.mapbox.mapboxsdk.annotations.MarkerViewManager; import com.mapbox.mapboxsdk.constants.MapboxConstants; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.egl.EGLConfigChooser; +import com.mapbox.mapboxsdk.maps.renderer.GlSurfaceViewRenderThread; import com.mapbox.mapboxsdk.maps.widgets.CompassView; import com.mapbox.mapboxsdk.maps.widgets.MyLocationView; import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings; @@ -312,6 +313,8 @@ public class MapView extends FrameLayout { }); glSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY); glSurfaceView.setVisibility(View.VISIBLE); + + nativeMapView.setRenderThread(new GlSurfaceViewRenderThread(glSurfaceView)); } /** @@ -494,15 +497,6 @@ public class MapView extends FrameLayout { // Rendering // - // Called when the map needs to be rerendered - // Called via JNI from NativeMapView - protected void onInvalidate() { - if (glSurfaceView != null) { - glSurfaceView.requestRender(); - } - // TODO: removable? postInvalidate(); - } - @Override protected void onSizeChanged(int width, int height, int oldw, int oldh) { if (destroyed) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index a97b7cc8f2..240e68bf13 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -20,6 +20,7 @@ import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.geometry.ProjectedMeters; +import com.mapbox.mapboxsdk.maps.renderer.RenderThread; import com.mapbox.mapboxsdk.storage.FileSource; import com.mapbox.mapboxsdk.style.layers.CannotAddLayerException; import com.mapbox.mapboxsdk.style.layers.Filter; @@ -52,6 +53,9 @@ final class NativeMapView implements GLSurfaceView.Renderer { // Used for callbacks private MapView mapView; + // Used to schedule work on the render thread + private RenderThread renderThread; + //Hold a reference to prevent it from being GC'd as long as it's used on the native side private final FileSource fileSource; @@ -69,7 +73,7 @@ final class NativeMapView implements GLSurfaceView.Renderer { // Constructors // - public NativeMapView(MapView mapView) { + public NativeMapView(final MapView mapView) { Context context = mapView.getContext(); fileSource = FileSource.getInstance(context); @@ -84,6 +88,10 @@ final class NativeMapView implements GLSurfaceView.Renderer { // Methods // + public void setRenderThread(RenderThread renderThread) { + this.renderThread = renderThread; + } + private boolean isDestroyedOn(String callingMethod) { if (destroyed && !TextUtils.isEmpty(callingMethod)) { Timber.e( @@ -104,7 +112,8 @@ final class NativeMapView implements GLSurfaceView.Renderer { if (isDestroyedOn("update")) { return; } - nativeUpdate(); + + requestRender(); } public void render() { @@ -864,9 +873,28 @@ final class NativeMapView implements GLSurfaceView.Renderer { // Callbacks // - protected void onInvalidate() { - if (mapView != null) { - mapView.onInvalidate(); + /** + * Called from JNI whenever the native map + * needs rendering. + */ + protected void requestRender() { + if (renderThread != null) { + renderThread.requestRender(); + } + } + + /** + * Called from JNI when work needs to be processed on + * the Renderer Thread. + */ + protected void requestProcessing() { + if (renderThread != null) { + renderThread.queueEvent(new Runnable() { + @Override + public void run() { + nativeProcess(); + } + }); } } @@ -905,6 +933,8 @@ final class NativeMapView implements GLSurfaceView.Renderer { private native void nativeDestroy(); + private native void nativeProcess(); + private native void nativeInitializeDisplay(); private native void nativeTerminateDisplay(); @@ -1130,9 +1160,7 @@ final class NativeMapView implements GLSurfaceView.Renderer { void addSnapshotCallback(@NonNull MapboxMap.SnapshotReadyCallback callback) { snapshotReadyCallback = callback; scheduleTakeSnapshot(); - mapView.onInvalidate(); - // TODO. this should do a request render - //render(); + renderThread.requestRender(); } // diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/GlSurfaceViewRenderThread.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/GlSurfaceViewRenderThread.java new file mode 100644 index 0000000000..4b8df51dbe --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/GlSurfaceViewRenderThread.java @@ -0,0 +1,25 @@ +package com.mapbox.mapboxsdk.maps.renderer; + +import android.opengl.GLSurfaceView; + +/** + * {@link RenderThread} implementation that schedules using the + * {@link GLSurfaceView} thread. + */ +public class GlSurfaceViewRenderThread implements RenderThread { + private final GLSurfaceView surfaceView; + + public GlSurfaceViewRenderThread(GLSurfaceView surfaceView) { + this.surfaceView = surfaceView; + } + + @Override + public void requestRender() { + surfaceView.requestRender(); + } + + @Override + public void queueEvent(Runnable runnable) { + surfaceView.queueEvent(runnable); + } +} diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/RenderThread.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/RenderThread.java new file mode 100644 index 0000000000..3b9f0f2151 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/RenderThread.java @@ -0,0 +1,12 @@ +package com.mapbox.mapboxsdk.maps.renderer; + +/** + * Created by ivo on 11/09/2017. + */ + +public interface RenderThread { + + void requestRender(); + + void queueEvent(Runnable runnable); +} -- cgit v1.2.1