diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-09-11 11:04:53 +0300 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-09-22 23:33:56 +0300 |
commit | 15a47d116a0fc15d249b37574fcd932ce88909df (patch) | |
tree | 520327b215324b19cf30ecd207fad651b7b83fba /platform/android/MapboxGLAndroidSDK/src/main | |
parent | 347d7c19c0a70f91252163b14e37583eea83fdd5 (diff) | |
download | qtlocation-mapboxgl-15a47d116a0fc15d249b37574fcd932ce88909df.tar.gz |
[android] schedule work on the gl thread using GLSurfaceView#queueEvent
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main')
4 files changed, 76 insertions, 17 deletions
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); +} |