yandexmobile / yandexmapkit-android

Yandex Map Kit for Android
161 stars 65 forks source link

Тормоза при при приближении карты в примере "Путь" #300

Closed pdapnz closed 6 years ago

pdapnz commented 6 years ago

Доброго времени суток!

Обнаружил пару проблем в примере мапкита "Путь". Подскажите пожалуйста как можно это побороть.

https://github.com/yandexmobile/yandexmapkit-android/tree/master/yandexmapkit-sample/src/ru/mapkittest/path

1) Если близко приблизить кусок пути, отрисовка карты начинает дико тормозить. Почему это может происходит и как можно с этим бороться?

2) Второй глюк с этим примером, если очень сильно приблизить часть линии, чтобы точки ломаной оказались за границей видимой области, то линия вообще пропадает с экрана. Как можно это побороть?

pdapnz commented 6 years ago

Тормозит и в итоге совсем перестает рисоваться из-за огромного размера текстуры на которую помещается Path.

W/OpenGLRenderer: Shape too large to be rendered into a texture (16688x13029, max=16384x16384) или так W/OpenGLRenderer: Shape path too large to be rendered into a texture (4145x3148, max=4096x4096)

Способ решения проблемы нашел здесь: https://github.com/MKergall/osmbonuspack/issues/171

Суть в том чтобы рисовать сначала на Bitmap размером с экран. И затем этот Bitmap помещать на экран.

public class TrackSoftwareRender implements IRender {

    private View mapView;
    private Bitmap bmp;
    private Path path = new Path();

    public TrackSoftwareRender(View mapView ) {
        this.mapView = mapView ;
    }

    @Override
    public void draw(Canvas canvas, OverlayItem item_) {
        TrackOverlayItem item = (TrackOverlayItem) item_;
        if (item.isVisible() && item.screenPoint != null && item.screenPoint.size() > 0) {
            final Rect dest = new Rect(0, 0, mapView.getWidth() + 1, mapView.getHeight() + 1);
            if (bmp == null || bmp.getWidth() != mapView.getWidth() || bmp.getHeight() != mapView.getHeight()) { // create Bitmap only once if needed
                bmp = Bitmap.createBitmap(mapView.getWidth(), mapView.getHeight(), Bitmap.Config.ARGB_8888); // this most time consuming step, app. 30 ms!
            } else {
                bmp.eraseColor(Color.TRANSPARENT); // recycle bitmap and erase the old bitmap, much faster 0.6 .. 0.9 ms
            }
            final Canvas bmpCanvas = new Canvas(bmp);

            path.reset();
            ScreenPoint screenPoint = item.screenPoint.get(0);
            path.moveTo(screenPoint.getX(), screenPoint.getY());
            for (int i = 1; i < item.screenPoint.size(); i++) {
                screenPoint = item.screenPoint.get(i);
                path.lineTo(screenPoint.getX(), screenPoint.getY());
            }

            bmpCanvas.drawPath(path, MapPaint.getPaint());
            canvas.drawBitmap(bmp, dest, dest, null);
        }
    }
}

Проверял на "дедушкином" телефоне такой вариант на нем работает быстрее чем пример из мапкита.