Offscreen-Canvas 有时不渲染
Offscreen-Canvas not rendering some of the time
我正在尝试为扩展传单的传单库实现浏览器光栅绘图插件 GridLayer api。本质上,对于每个图块,都有函数 createTile
,returns 一个 canvas,上面有一些绘图。传单显示了正确位置的图块。
initialize: function(raster_data){
this.raster_data = raster_data;
},
createTile: function (tile_coords) {
let _tile = document.createElement('canvas');
let _tile_ctx = _tile.getContext('2d');
// do some drawing here with values from this.raster_data
return _tile;
}
此实现目前运行良好。比我想到的要在 webworker 中使用 offscreen-canvas 卸载绘图。所以我像这样重组代码
initialize: function(raster_data){
this.raster_data = raster_data;
this.tile_worker = new Worker('tile_renderer.js')
},
createTile: function (tile_coords) {
let _tile = document.createElement('canvas').transferControlToOffscreen();
this.tile_worker.postMessage({
_tile: _tile,
_raster_data: this.raster_data
},[_tile])
return _tile;
}
这行得通,但我时不时地看到 canvas 是空白的。那东西很随机我不知道从哪里开始以及如何调试它。这可能是我使用单个工作人员渲染每个图块的问题吗?任何帮助表示赞赏。这是空白 canvas 的示例。
这是一个已知错误:https://crbug.com/1202481
当太多 OffscreenCanvases 串行发送到 Worker 时出现问题。
解决方法是在一次调用中批量发送所有这些 OffscreenCanvases 到 postMessage()
。
在您的代码中,您可以通过存储所有要发送的对象并使用简单的去抖动策略使用 0 超时一次发送所有对象来实现此目的:
createTile: function (tile_coords) {
let _tile = document.createElement('canvas');
_tile.setAttribute('width', 512);
_tile.setAttribute('height', 512);
let _off_tile = _tile.transferControlToOffscreen();
this.tiles_to_add.push( _off_tile ); // store for later
clearTimeout( this.batch_timeout_id ); // so that the callback is called only once
this.batch_timeout_id = setTimeout( () => {
// send them all at once
this.tileWorker.postMessage( { tiles: this.tiles_to_add }, this.tiles_to_add );
this.tiles_to_add.length = 0;
});
return _tile;
}
我正在尝试为扩展传单的传单库实现浏览器光栅绘图插件 GridLayer api。本质上,对于每个图块,都有函数 createTile
,returns 一个 canvas,上面有一些绘图。传单显示了正确位置的图块。
initialize: function(raster_data){
this.raster_data = raster_data;
},
createTile: function (tile_coords) {
let _tile = document.createElement('canvas');
let _tile_ctx = _tile.getContext('2d');
// do some drawing here with values from this.raster_data
return _tile;
}
此实现目前运行良好。比我想到的要在 webworker 中使用 offscreen-canvas 卸载绘图。所以我像这样重组代码
initialize: function(raster_data){
this.raster_data = raster_data;
this.tile_worker = new Worker('tile_renderer.js')
},
createTile: function (tile_coords) {
let _tile = document.createElement('canvas').transferControlToOffscreen();
this.tile_worker.postMessage({
_tile: _tile,
_raster_data: this.raster_data
},[_tile])
return _tile;
}
这行得通,但我时不时地看到 canvas 是空白的。那东西很随机我不知道从哪里开始以及如何调试它。这可能是我使用单个工作人员渲染每个图块的问题吗?任何帮助表示赞赏。这是空白 canvas 的示例。
这是一个已知错误:https://crbug.com/1202481
当太多 OffscreenCanvases 串行发送到 Worker 时出现问题。
解决方法是在一次调用中批量发送所有这些 OffscreenCanvases 到 postMessage()
。
在您的代码中,您可以通过存储所有要发送的对象并使用简单的去抖动策略使用 0 超时一次发送所有对象来实现此目的:
createTile: function (tile_coords) {
let _tile = document.createElement('canvas');
_tile.setAttribute('width', 512);
_tile.setAttribute('height', 512);
let _off_tile = _tile.transferControlToOffscreen();
this.tiles_to_add.push( _off_tile ); // store for later
clearTimeout( this.batch_timeout_id ); // so that the callback is called only once
this.batch_timeout_id = setTimeout( () => {
// send them all at once
this.tileWorker.postMessage( { tiles: this.tiles_to_add }, this.tiles_to_add );
this.tiles_to_add.length = 0;
});
return _tile;
}