es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android Jetpack Composable Dibuja una gran lista de coordenadas.

Tengo una lista de 36000 coordenadas que necesito trazar en un lienzo como puntos. Las coordenadas cambian constantemente, por lo que las mantengo en un mapa como parte de mi ViewModel como mutableStateOf(HashMap<int, atomicinteger="">()) y los AtomicIntegers se actualizan constantemente.

El mapa consiste en ángulos y distancias que convierto en coordenadas en el lienzo. Esto funciona, pero mi pregunta es si esta es la forma más eficiente de dibujar esto, ya que iterar continuamente a través del mapa parece ineficiente.

@Composable
fun lidarComposable(vm: MainViewModel) {
    MaterialTheme {
        Column {
            Canvas(modifier = Modifier.size(500.dp, 500.dp)) {
                drawRect(Color.LightGray, topLeft = Offset(0f, 0f), size = Size(this.size.width, this.size.height))
                drawCircle(Color.Blue, 20F, this.center)
                vm.lidardata.data.forEach { (a, d) ->
                        val angle: Double = a.toDouble() / Lidar.relevence
                        val distance: Double = (d.get() / Lidar.relevence).toDouble()
                        val fixed = angle - vm.compass
                        val rad = fixed * PI / 180
                        val xx = this.center.x + (distance * cos(rad))
                        val yy = this.center.y + (distance * sin(rad))
                        drawCircle(Color.Red, 5F, Offset(xx.toFloat(), yy.toFloat()))
                }
            }
        }
    }
}

El resultado es un lienzo gris con un círculo azul en el centro y los puntos donde los quiero, pero parece que debe haber una forma mejor.

Después de un tiempo de recolectar datos de un LIDAR giratorio, obtengo una imagen bastante precisa de la habitación, pero soy nuevo en Compose y me pregunto si hay una forma mejor de enviar cambios al lienzo.

Imagen</int,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible optimización sería redibujar solo los puntos que han cambiado desde el último cuadro, en lugar de iterar a través de todo el mapa cada vez que se dibuja el lienzo. Podrías llevar un seguimiento de las coordenadas previamente dibujadas en un mapa o lista separada, y compararlas con las coordenadas actuales para determinar qué puntos necesitan ser actualizados. Esto reduciría la cantidad de trabajo requerido al solo redibujar los puntos que han cambiado, en lugar de redibujar todo el lienzo cada vez.

    Otra posible optimización sería transferir el procesamiento de los datos brutos del lidar a un hilo separado, utilizando coroutines u otro marco de concurrencia. Esto evitaría que la interfaz de usuario se vuelva no responsive al procesar grandes cantidades de datos, y permitiría que el lienzo se actualice de manera más suave.

    Finalmente, podrías experimentar con diferentes técnicas de dibujo, como el uso de OpenGL o aceleración por hardware, para ver si ofrecen alguna mejora de rendimiento en comparación con el enfoque actual. Esto requeriría un aprendizaje e implementación adicional, pero podría resultar en una representación más rápida y eficiente de los datos del lidar en el lienzo.

Comments are closed.