在OpenLayers中,我们曾经为我们添加到图层的每个单独的功能独立设置样式:
size_
较新版本的OpenLayers非常关注“styleFunction”功能,您只需要定义1个样式函数,而不是单独为每个功能设置样式:
let feat = new ol.Feature(geometry);
feat.setStyle(myStyle);
我注意到的主要事情是:“调用样式函数”会记录在地图的每个平移上,以及地图的每个缩放,用于图层上的所有要素。看起来myStyleFunction正在为图层上的所有功能执行,在地图的每个用户输入上。
问题:在DOM上使用styleFunction功能比使用每个功能的独立样式更重要吗?我们将使用数以千计的功能,并想知道什么会产生最佳性能。使用旧方法,我无法找到一种方法来学习何时在后台重绘功能,但我们只设置了一次样式,之后没有修改。那么这是否意味着旧方法对性能更好?
当然,OpenLayers 3的内部工作非常复杂并且依赖于很多东西,我希望你们中的一个人可以对这个功能有所了解。感谢。
答案 0 :(得分:7)
OpenLayers 3是围绕使用样式函数构建的,这意味着即使是第一个示例也会创建样式函数。 1
当要渲染要素时,OL3首先在要素上查找样式函数。如果没有,则使用图层的样式功能。 2
因此,对您的问题的一般答案是否定的,在图层上使用styleFunction不会比在每个要素上设置样式更重。
将样式函数设置为function(){return myStyle}
在功能上等同于将myStyle
设置为每个要素的样式。它还会比在每个特征上设置样式稍微好一点(因为),因为使用单个函数而不是为每个特征创建,存储和垃圾收集相同的函数。
说到这里,你的样式函数的例子比在每个特征上设置样式要慢一些,因为它在每次调用时动态创建新的样式对象。要优化样式函数,您应该考虑创建样式函数使用的一组预先创建的样式:
var myStyles = {
blue: new ol.style.Style(...),
default: new ol.style.Style(...),
};
function myStyleFunction(feature) {
if (feature.get('drawBlue')) {
return myStyles.blue;
} else {
return myStyles.default;
}
}
一些旁注: