Используя новейший 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 ...