我正试图从基于SharedArrayBuffer
的Uint8ClampedArray
创建一个新的ImageData
,因为ImageData
构造函数不接受基于SharedArrayBuffer
的Uint8ClampedArray
,所以我必须以某种方式将其转换为普通的ArrayBuffer
。
有什么想法吗?我如何将SharedArrayBuffer
转换为普通的ArrayBuffer
,或者我如何用SharedArrayBuffer
创建ImageData
?
您必须将数据复制到上下文将完全拥有的缓冲区中。
您只需在SAB:的Uint8ClampedArray上调用.slice()
即可完成此操作
const sab = new SharedArrayBuffer( 50 * 50 * 4 );
const arr = new Uint8ClampedArray( sab );
const img = new ImageData( arr.slice(), 50, 50 );
或者,如果你要多次绘制这个SAB的内容,那么创建一个固定的ArrayBuffer,并用SAB的属性填充它:
const sab = new SharedArrayBuffer( 50 * 50 * 4 );
const sab_view = new Uint8ClampedArray( sab );
const ab = new ArrayBuffer(sab.byteLength);
const arr = new Uint8ClampedArray( ab );
const img = new ImageData( arr, 50, 50 );
// later when sab has new content being set
arr.set(sab_view, 0);
实时示例(来源(
(外包是因为SharedArray Buffer需要COOP,StackSnippet不会给我们…(。