Mapbox для macOS показывает высокую загрузку процессора во время анимации - PullRequest
0 голосов
/ 06 мая 2019

Используя новейший API mapbox для macOS, новейший XCode и новейшую macOS, я успешно загрузил свою карту в своем стиле в простое окно + представление. На нем я загружаю данные о радиолокационной погоде (WMS, png изображения) как MGLImageSource и добавляю их как MGLRasterStyleLayer в свой mapView. Чтобы быть точным, я загружаю n изображений (каждое с разной отметкой времени, интервалом 5 минут) и создаю n слоев (с разными именами) для их циклического переключения: цель - анимация радиолокационных данных (аналогично или идентично https://docs.mapbox.com/mapbox-gl-js/example/animate-images/).

Я использую простую настройку таймера GCD:

func showRadarImages() {
    //increase index, get layer 
    DispatchQueue.main.async {

        layer.isVisible = false/true

    }

}

let queue = DispatchQueue(label: "radarTimer", attributes: .concurrent)
timer = DispatchSource.makeTimerSource(flags: .strict, queue: queue)
timer.schedule(deadline: .now(), repeating: .milliseconds(delay), leeway: .milliseconds(0))
timer.setEventHandler(handler: { [weak self] in

    self?.showRadarImages()

})
timer.activate()

Это работает, однако у меня загрузка процессора составляет ~ 100-150%, а вентиляторы моего MacBook Pro работают на полную мощность.

Урезав весь код, чтобы буквально только скрыть и показать слой внутри этого «цикла», процессор все равно увеличивается. Раскомментирование этой строки (.isVisible = false / true) приводит к тому, что процессор успокоится, но анимация тоже.

Кроме того, использование задержки 300 мс и ниже не улучшает плавность анимации (поэтому я никогда не вижу беглой анимации).

Раньше я пробовал NSTimer, который на самом деле работал намного плавнее (у меня был только ОДИН слой и менял параметр .image), но он также поднимал процессор. Поэтому я ищу решение, которое можно запустить без высокой производительности процессора.

Есть ли способ улучшить производительность? Или это просто ограничение рендеринга карты mapbox с несколькими слоями в режиме реального времени, когда процессор всегда будет выдвигаться?

Буду признателен за каждый комментарий и благодарен за каждое предложение!

Спасибо

Обновление

Теперь я переписал весь код, используя DispatchSourceUserDataAdd и DispatchSourceTimer. Таймер вычисляет индекс нового изображения в фоновом потоке и передает его источнику UserDataAdd. Источник UserDataAdd работает в основном потоке и обновляется настолько быстро, насколько это возможно в графическом интерфейсе, игнорируя все индексы, переходя прямо к новейшему индексу (все это основано на Обновление интерфейса с помощью Dispatch_Async в Swift ). Кроме того, теперь я снова устанавливаю параметр .image, имея только ОДИН слой и один источник.

Результат: кажется, что он на самом деле быстрее, но многие изображения пропускаются, потому что графический интерфейс не обновляется так быстро, как это необходимо ... также, процессор все еще на 150%.

Использование той же настройки в Javascript API Mapbox работает плавно и без высокой загрузки ЦП в Safari ...

...