使用适用于macOS的最新mapbox API,最新的Xcode和最新的macOS,我已成功将自定义样式的地图加载到一个简单的窗口+视图中。在其上,我将雷达天气数据(WMS,png图像)下载为MGLImageSource,并将其作为MGLRasterStyleLayer添加到我的mapView中。确切地说,我下载了n张图像(每个图像使用不同的时间戳,间隔5分钟)并创建n个图层(使用不同的名称)以循环浏览它们:目标是雷达数据的动画(类似于{ {3}}。
我使用一个简单的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()
这有效,但是,我遇到的CPU使用率为〜100-150%,并且MacBook Pro的风扇运转很快。
简化了整个代码的过程,实际上只是隐藏并显示了这个“循环”中的一层,而CPU仍然在增加。取消注释这一行(.isVisible = false / true)可使CPU处于平稳状态,但动画如此。
使用300毫秒或更短的延迟也不会提高动画的流畅性(因此我从来没有看过流畅的动画)。
之前,我尝试过NSTimer,它实际上工作得更流畅(我只有一层,并且正在更改.image参数),但是它也使CPU运转异常。因此,我正在寻找一种可以在不提高CPU性能的情况下运行的解决方案。
是否有提高性能的方法?还是仅仅是实时地渲染具有多个图层的Mapbox地图的局限性?
我会很感激每条评论,感谢您的每条建议!
谢谢
更新:
我现在使用DispatchSourceUserDataAdd和DispatchSourceTimer重写了整个代码。计时器在后台线程上计算新的图像索引,并将其交给UserDataAdd源。 UserDataAdd源在主线程上工作,并且GUI会尽快更新它,而忽略了到目前为止的所有索引,直接跳转到最新的索引(这全部基于https://docs.mapbox.com/mapbox-gl-js/example/animate-images/)。 另外,现在我再次设置.image参数,只有一层和一个来源。
结果是:它实际上似乎更快,但是由于GUI无法像需要的那样快速更新,因此跳过了许多图像...而且,CPU仍为150%。
在Mapbox的Javascript API上使用相同的设置可以流畅运行,并且在Safari中无需占用大量CPU ...