Skip to content

Commit fd0116f

Browse files
jushgithub-actions[bot]
authored andcommitted
Avoid creating objects during render pass (#4612)
GitOrigin-RevId: adeb205908596273fd78594e65a0d66068471426
1 parent b08269e commit fd0116f

File tree

3 files changed

+26
-18
lines changed

3 files changed

+26
-18
lines changed

maps-sdk/src/main/java/com/mapbox/maps/renderer/FpsManager.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.mapbox.maps.renderer
22

33
import android.os.Handler
44
import androidx.annotation.RestrictTo
5-
import androidx.core.os.postDelayed
5+
import androidx.core.os.HandlerCompat
66
import com.mapbox.maps.logI
77
import com.mapbox.maps.logW
88
import kotlin.math.pow
@@ -85,6 +85,10 @@ internal class FpsManager(
8585
return true
8686
}
8787

88+
/**
89+
* Keep a runnable to [onRenderingPaused] to avoid creating a new one every time.
90+
*/
91+
private val onRenderingPausedRunnable = Runnable { onRenderingPaused() }
8892
fun postRender() {
8993
val frameRenderTimeNs = System.nanoTime() - preRenderTimeNs
9094
frameRenderTimeAccumulatedNs += frameRenderTimeNs
@@ -95,12 +99,12 @@ internal class FpsManager(
9599
// however to produce correct values we also update FPS after IDLE_TIMEOUT_MS
96100
// otherwise when updating the map after it was IDLE first update will report
97101
// huge delta between new frame and last frame (as we're using dirty rendering)
98-
handler.postDelayed(
99-
VSYNC_COUNT_TILL_IDLE * (screenRefreshPeriodNs / ONE_MILLISECOND_NS),
100-
fpsManagerToken
101-
) {
102-
onRenderingPaused()
103-
}
102+
HandlerCompat.postDelayed(
103+
handler,
104+
onRenderingPausedRunnable,
105+
fpsManagerToken,
106+
VSYNC_COUNT_TILL_IDLE * (screenRefreshPeriodNs / ONE_MILLISECOND_NS)
107+
)
104108
}
105109
preRenderTimeNs = -1L
106110
}

maps-sdk/src/main/java/com/mapbox/maps/renderer/MapboxRenderThread.kt

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,15 @@ internal class MapboxRenderThread : Choreographer.FrameCallback {
211211
this.TAG = ""
212212
}
213213

214+
/**
215+
* Keep a runnable to [prepareRenderFrame] to avoid creating a new one on every frame.
216+
*/
217+
private val prepareRenderFrameRunnable: Runnable = Runnable {
218+
prepareRenderFrame()
219+
}
214220
private fun postPrepareRenderFrame(delayMillis: Long = 0L) {
215221
renderHandlerThread.postDelayed(
216-
{
217-
prepareRenderFrame()
218-
},
222+
prepareRenderFrameRunnable,
219223
delayMillis
220224
)
221225
}
@@ -506,8 +510,8 @@ internal class MapboxRenderThread : Choreographer.FrameCallback {
506510
fun onSurfaceSizeChanged(width: Int, height: Int) {
507511
if (this.width != width || this.height != height) {
508512
renderHandlerThread.post {
509-
this.width = width
510-
this.height = height
513+
this@MapboxRenderThread.width = width
514+
this@MapboxRenderThread.height = height
511515
sizeChanged = true
512516
prepareRenderFrame()
513517
}
@@ -522,7 +526,7 @@ internal class MapboxRenderThread : Choreographer.FrameCallback {
522526
if (renderHandlerThread.isRunning) {
523527
renderHandlerThread.post {
524528
awaitingNextVsync = false
525-
Choreographer.getInstance().removeFrameCallback(this)
529+
Choreographer.getInstance().removeFrameCallback(this@MapboxRenderThread)
526530
surfaceProcessingLock.withLock {
527531
// TODO https://github.com/mapbox/mapbox-maps-android/issues/607
528532
if (nativeRenderCreated && mapboxRenderer is MapboxTextureViewRenderer) {
@@ -687,9 +691,11 @@ internal class MapboxRenderThread : Choreographer.FrameCallback {
687691
renderThreadPrepared -> {
688692
renderEvent.runnable?.run()
689693
}
694+
690695
paused -> {
691696
nonRenderEventQueue.add(renderEvent)
692697
}
698+
693699
else -> {
694700
logW(TAG, "Non-render event could not be run, retrying in $RETRY_DELAY_MS ms...")
695701
postNonRenderEvent(renderEvent, delayMillis = RETRY_DELAY_MS)
@@ -712,9 +718,7 @@ internal class MapboxRenderThread : Choreographer.FrameCallback {
712718
paused = false
713719
logI(TAG, "Renderer resumed, renderThreadPrepared=$renderThreadPrepared, surface.isValid=${surface?.isValid}")
714720
// schedule render if we resume not after first create (e.g. bring map back to front)
715-
renderPreparedGuardedRun {
716-
postPrepareRenderFrame()
717-
}
721+
renderPreparedGuardedRun(::postPrepareRenderFrame)
718722
}
719723

720724
@UiThread

maps-sdk/src/main/java/com/mapbox/maps/renderer/RenderHandlerThread.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ internal class RenderHandlerThread(
3131
@Suppress("PrivatePropertyName")
3232
private val TAG = "Mbgl-$handlerThreadName" + if (mapName.isNotBlank()) "\\$mapName" else ""
3333

34-
fun post(task: () -> Unit) {
34+
fun post(task: Runnable) {
3535
postDelayed(task, 0)
3636
}
3737

38-
fun postDelayed(task: () -> Unit, delayMillis: Long) {
38+
fun postDelayed(task: Runnable, delayMillis: Long) {
3939
handler?.let {
4040
val message = Message.obtain(it, task)
4141
it.sendMessageDelayed(message, delayMillis)

0 commit comments

Comments
 (0)