[android] schedule work on the gl thread using GLSurfaceView#queueEvent

This commit is contained in:
Ivo van Dongen
2017-09-11 11:04:53 +03:00
committed by Ivo van Dongen
parent 347d7c19c0
commit 15a47d116a
9 changed files with 124 additions and 49 deletions

View File

@@ -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) {

View File

@@ -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();
}
//

View File

@@ -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);
}
}

View File

@@ -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);
}