Browse Source

Improve performance by extracting windowManager and getRotatedValues()

Once sensor listeners are registered, onSensorChanged() (and subsequently
getRotatedValues()) gets called multiple times per socond. Obtaining
WindowManager on each of those calls is superfluous and can be avoided
by extracting it to a lazy class val. getRotatedValue() can also be
called before checking sensor type, and used for each one of them,
resulting in less code repetition.
melquiadess 1 year ago
parent
commit
f09d033156
1 changed files with 15 additions and 20 deletions
  1. 15 20
      platform/android/java/lib/src/org/godotengine/godot/Godot.kt

+ 15 - 20
platform/android/java/lib/src/org/godotengine/godot/Godot.kt

@@ -85,6 +85,9 @@ class Godot(private val context: Context) : SensorEventListener {
 		private val TAG = Godot::class.java.simpleName
 		private val TAG = Godot::class.java.simpleName
 	}
 	}
 
 
+	private val windowManager: WindowManager by lazy {
+		requireActivity().getSystemService(Context.WINDOW_SERVICE) as WindowManager
+	}
 	private val pluginRegistry: GodotPluginRegistry by lazy {
 	private val pluginRegistry: GodotPluginRegistry by lazy {
 		GodotPluginRegistry.getPluginRegistry()
 		GodotPluginRegistry.getPluginRegistry()
 	}
 	}
@@ -818,11 +821,8 @@ class Godot(private val context: Context) : SensorEventListener {
 		if (values == null || values.size != 3) {
 		if (values == null || values.size != 3) {
 			return null
 			return null
 		}
 		}
-		val display =
-			(requireActivity().getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
-		val displayRotation = display.rotation
 		val rotatedValues = FloatArray(3)
 		val rotatedValues = FloatArray(3)
-		when (displayRotation) {
+		when (windowManager.defaultDisplay.rotation) {
 			Surface.ROTATION_0 -> {
 			Surface.ROTATION_0 -> {
 				rotatedValues[0] = values[0]
 				rotatedValues[0] = values[0]
 				rotatedValues[1] = values[1]
 				rotatedValues[1] = values[1]
@@ -851,40 +851,35 @@ class Godot(private val context: Context) : SensorEventListener {
 		if (renderView == null) {
 		if (renderView == null) {
 			return
 			return
 		}
 		}
+
+		val rotatedValues = getRotatedValues(event.values)
+
 		when (event.sensor.type) {
 		when (event.sensor.type) {
 			Sensor.TYPE_ACCELEROMETER -> {
 			Sensor.TYPE_ACCELEROMETER -> {
-				getRotatedValues(event.values)?.let { rotatedValues ->
+				rotatedValues?.let {
 					renderView?.queueOnRenderThread {
 					renderView?.queueOnRenderThread {
-						GodotLib.accelerometer(
-							-rotatedValues[0], -rotatedValues[1], -rotatedValues[2]
-						)
+						GodotLib.accelerometer(-it[0], -it[1], -it[2])
 					}
 					}
 				}
 				}
 			}
 			}
 			Sensor.TYPE_GRAVITY -> {
 			Sensor.TYPE_GRAVITY -> {
-				getRotatedValues(event.values)?.let { rotatedValues ->
+				rotatedValues?.let {
 					renderView?.queueOnRenderThread {
 					renderView?.queueOnRenderThread {
-						GodotLib.gravity(
-							-rotatedValues[0], -rotatedValues[1], -rotatedValues[2]
-						)
+						GodotLib.gravity(-it[0], -it[1], -it[2])
 					}
 					}
 				}
 				}
 			}
 			}
 			Sensor.TYPE_MAGNETIC_FIELD -> {
 			Sensor.TYPE_MAGNETIC_FIELD -> {
-				getRotatedValues(event.values)?.let { rotatedValues ->
+				rotatedValues?.let {
 					renderView?.queueOnRenderThread {
 					renderView?.queueOnRenderThread {
-						GodotLib.magnetometer(
-							-rotatedValues[0], -rotatedValues[1], -rotatedValues[2]
-						)
+						GodotLib.magnetometer(-it[0], -it[1], -it[2])
 					}
 					}
 				}
 				}
 			}
 			}
 			Sensor.TYPE_GYROSCOPE -> {
 			Sensor.TYPE_GYROSCOPE -> {
-				getRotatedValues(event.values)?.let { rotatedValues ->
+				rotatedValues?.let {
 					renderView?.queueOnRenderThread {
 					renderView?.queueOnRenderThread {
-						GodotLib.gyroscope(
-							rotatedValues[0], rotatedValues[1], rotatedValues[2]
-						)
+						GodotLib.gyroscope(it[0], it[1], it[2])
 					}
 					}
 				}
 				}
 			}
 			}