javascript - OL3 ImageCanvas renderFunction 性能不佳

标签 javascript canvas openlayers-3

所以我正在尝试使用 Esri opensource example (windy.js)并使用类似于 the OL3 D3 example 的东西在 OpenLayers 3 上渲染它.

windy.js 在 Canvas 上渲染风动画 map 。 Canvas 大小似乎不会改变渲染性能。

首先,我将 windy.js 渲染到 Canvas 上并每 0.5 秒更新一次:

g_windy = new Windy({
    canvas: $("#canvas")[0],
    data: //Some data
});
//map is an OL3 Map object
function redraw() {
  windy.stop();

  setTimeout(function() {
    var mapSize = map.getSize();
    var extent = map.getView().calculateExtent(mapSize);

    extent = ol.proj.transformExtent(extent, 'EPSG:3857', 'EPSG:4326');

    var canvas_bounds = [
        [0,0],
        [mapSize[0]*2, mapSize[1]*2]
      ]; 

      var map_projected_bounds = [
        [
          extent[0],
          extent[1]
        ],
        [
          extent[2],
          extent[3]
        ]
      ];

    windy.start(
      canvas_bounds,
      mapSize[0]*2, mapSize[1]*2, 
      map_projected_bounds
    );
  }, 500);
}

redraw();

我的 canvasFunction 实现引用了 windy.js 呈现并返回它的 Canvas :

var canvasFunction = function(extent, resolution, pixelRatio, size, projection) {
  canvas = $("canvas#canvas")[0];
  canvas.setAttribute('width', map.getSize()[0]*4);
  canvas.setAttribute('height', map.getSize()[1]*4);
  return canvas;
};

我现在将图层添加到我的 map 中:

var canvasLayer = new ol.layer.Image({
  source: new ol.source.ImageCanvas({
    canvasFunction: canvasFunction,
    projection: 'EPSG:3857',
    ratio: 1
  })
});

map.addLayer(canvasLayer);
map.getView().on('change:center', redraw);
map.getView().on('change:resolution', redraw);

//Next I update my map to rerender at a fast interval. Note that having 1 millisecond vs 60 frames/second does not change performace.
setInterval(function() { map.updateSize();}, 1);

我的结果在我的 map 上显示了 windy.js 图层,但我遇到了一个问题:

  • windy.js Canvas 的性能问题为零,运行流畅,但 OL3 层在较大的 Canvas / map 尺寸下非常滞后。

复制 Canvas 并不是我们想要实现的完美实现,但它比从 OL3 发出拉取请求并添加可以支持此功能的功能更有效。

最佳答案

因为我是这些风图的忠实粉丝,所以我忍不住试一试。

与 D3 示例的主要区别在于,D3 Canvas 是静态的,只有在 map 范围发生变化时才需要更新。 Windy.js 运行自己的动画循环,并且必须不断更新。首先 windy.js 绘制到它自己的 Canvas 中,然后 ol3 必须将这个 Canvas 绘制到 map 上。也许可以优化此技术,但我建议采用不同的方法:

创建一个 canvas 元素,windy.js 可以在其中绘制。在它旁边为 OpenLayers 创建一个 div 元素:

<div id="map" class="map">
  <canvas id="windyMap" class="fill"></canvas>
  <div id="olMap" class="fill"></div>
</div>

使用几行 CSS 将 Canvas 定位在 map div 上方,并确保事件仍然传递(pointer-events: none)。每次平移/缩放 map 时,重新启动 windy.js 动画。就这样。

Demo - Code

关于javascript - OL3 ImageCanvas renderFunction 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714262/

相关文章:

javascript - ol3 与 IE11 在 c# webbrowser 控制鼠标单击事件不工作

javascript - Openlayer3 - 避免折线在动画过程中消失

javascript - 从另一个 URL 创建图像提要

javascript - Canvas |在从 SVG 创建过程中如何设置 Canvas 元素的样式?

css - 为什么 Canvas drawImage 方法正在缩放?

javascript - 在 Canvas 中旋转图像并保持其可拖动

scroll - Openlayers 3 关闭平滑滚动

javascript - 使用 AJAX post 将对象数组发送到服务器端

javascript - 带有 websockets 的 Express.js

javascript - jQuery .click 函数连续执行两次