mapbox / mapbox/mapbox-maps-flutter

Exponential memory usage until crash with PolylineAnnotationManager.createMulti

Abierto
#492 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Dart
Estrellas
380
Forks
204
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Using PolylineAnnotationManager.createMulti the memory usage increases with each iteration.

image

With a slower iteration speed the increase is less dramatic.

image
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:mapbox_maps_flutter/mapbox_maps_flutter.dart';

List<PolylineAnnotationOptions> polylines = [];

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  MapboxOptions.setAccessToken("<TOKEN HERE>");

  var data = json.decode(await rootBundle.loadString("path.json")) as List;
  for(var n = 0; n < 10; n++) polylines.addAll(data.map((e) => PolylineAnnotationOptions(
    geometry: e,
    lineWidth: 5.0,
    lineColor: Colors.red.value,
    lineJoin: LineJoin.ROUND,
  )).toList());

  runApp(MaterialApp(home: MapSample()));
}

class MapSample extends StatefulWidget {
  @override
  State<MapSample> createState() => _MapSampleState();
}

class _MapSampleState extends State<MapSample> {
  final locationSettings = LocationComponentSettings(
    enabled: true,
    showAccuracyRing: true,
    pulsingEnabled: false,
    puckBearingEnabled: true,
    puckBearing: PuckBearing.HEADING
  );

  Stream<Position>? location;

  PolylineAnnotationManager? polylineAnnotationManager;
  
  @override
  initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
    body: MapWidget(
      key: ValueKey("map"),
      cameraOptions: CameraOptions(center: Point(coordinates: Position(-122.04160728, 37.33676622)), zoom: 12, pitch: 0.0),
      onMapCreated: (mapboxMap) async {
        await Future.wait([
          mapboxMap.scaleBar.updateSettings(ScaleBarSettings(enabled: false)),
          mapboxMap.gestures.updateSettings(GesturesSettings(rotateEnabled: false)),
          mapboxMap.attribution.updateSettings(AttributionSettings(clickable: false, iconColor: 1)),
          mapboxMap.location.updateSettings(locationSettings),
        ]);
        polylineAnnotationManager ??= await mapboxMap.annotations.createPolylineAnnotationManager();

        Timer.periodic(const Duration(milliseconds: 100), (_) async {
          polylineAnnotationManager!.deleteAll();
          await polylineAnnotationManager!.createMulti(polylines!);
        });
      }
    )
  );
}

https://github.com/ristiisa/mbmemleak/tree/annotations

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con las llamadas a PolylineAnnotationManager.createMulti y deleteAll en la reproducción de Dart proporcionada, especialmente con el bucle Timer.periodic. Ejecuta la reproducción mbmemleak/annotations y monitoriza la memoria mientras repites el bucle; se considera terminado cuando las eliminaciones y creaciones repetidas ya no provocan un crecimiento de memoria no acotado ni un fallo.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
dart, flutter
Área
mobile
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.