4

我有一个生成大量数据的应用程序。此数据需要在可用之前进行处理(WebGL 3D 应用程序)。所以我创建了一个 web worker 来进行处理,以防止阻塞 UI 的其余部分。

问题是当数据足够大时,第一次调用启动 web worker 会导致 Chrome 中的选项卡崩溃并显示“Aw, Snap”消息。我在 web worker 的一开始就设置了断点,它甚至没有进入 web worker。尝试克隆 postMessage() 调用的数据时,它似乎崩溃了。

这是一般数据结构(尝试将这些数组传递给网络工作者):

function MyClass(id) {
    var count32 = getSize();
    var count16 = count32 * 3;

    this.uint16    = new Uint16Array(count16);  // array buffer 1
    this.float32_a = new Float32Array(count32); // array buffer 2
    this.float32_b = new Float32Array(count32); // array buffer 3


    this.a = id;
    this.b = count32;
    this.c = new MyInnerClass();
    this.d = true;
    this.e = 6;
    this.f = {a: 1, b: 2, c: 3, d: 4};
    this.g = [];
}

function MyInnerClass() {
    this.a = -10;
    this.b = -20;
    this.c = -30;
    this.d =  10
    this.e =  20
    this.f =  30
}

问题在于数组缓冲区 1、2 和 3。我有一个MyClass对象数组,大约有 15,000 个,大约 97% 的数组缓冲区的元素少于 200 个。但对于剩下的 3%,数组缓冲区有 1,000 到 40,000 个元素。

有趣的是,如果我注释掉任何 2 个数组缓冲区,则包含这些类的 postMessage() 将起作用。

另一个有趣的点:如果我在 Chrome 的开发工具中单击“启动时暂停”复选框,postMessage() 有时会起作用,即使所有 3 个数组缓冲区也是如此。否则,每次都会失败。

有谁知道为什么会这样?我找不到关于我可能遇到的数据限制或其他奇怪的内部怪异的文档。否则,我将最终重构我的代码来解决这个问题。

演示:我创建了一个 jsfiddle 来演示这一点:http: //jsfiddle.net/GmvyJ/11/

如果您更改此小提琴中的数据最大大小(更改为 15,000),请不要以这种方式保存,否则您将永远无法访问该页面。

4

1 回答 1

2

您是否尝试过使用所有权转移将数据传递给工作线程。这在您传递大型数组缓冲区时特别有用,这将需要您使用一个额外的参数来更改 postMessage 调用postMessage(ObjectToTransfer,[ObjectToTransfer.buffer,.....]);

这样,您可以克隆整个对象,但在该对象中传输数组缓冲区。

使用来自 Web Worker 的可转移对象进行结帐

于 2014-06-12T17:04:57.037 回答