[android] schedule work on the gl thread using GLSurfaceView#queueEvent
This commit is contained in:
committed by
Ivo van Dongen
parent
347d7c19c0
commit
15a47d116a
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user