我正在创建一个 WebGL 游戏,它需要 WebWorker 进行一些网格处理,以防止主线程出现延迟。
我的问题 - 是在需要时生成/创建新的 WebWorker 并在工作完成后终止它们,还是创建一个在内部对网格处理进行排队的永久 WebWorker 更好?生成(和销毁)新的 WebWorker 是否会产生大量开销?
在需要时创建它们的主要优点是一次运行多个,没有等待完成的处理积压,这意味着更快的网格生成。
非常感谢任何建议,以便我可以优化我的代码以获得最佳性能。谢谢!
最佳答案
这不是一个真正的 WebGL 问题,它只是一个一般的 WebWorker 问题。尽管这取决于我的头脑。 worker 只是线程。如果您的线程 100% 的时间都在忙(不等待 IO 或用户输入或下一帧),那么一旦您的线程数多于内核数,您将不会获得任何加速。
换句话说,如果你有 2 个核心,3 个线程各自运行而不等待任何事情,那么 1 个核心将在 100% 的时间内运行 1 个线程,而另一个核心将在 50% 的时间内运行其他每个线程.总时间与将 2 个线程合并为 1 个线程一样。
因此,产生大量线程并不一定是胜利,而是有一个 way在浏览器中查询用户机器的 JavaScript 内核数。
最重要的是,您正在处理可能是大数据的网格。假设每个网格在处理时使用 200meg(就像在 JSON 中一样),在完成时使用 100meg(您已经阅读了 JSON 并转换为 Float32Arrays 等)。换句话说,完成后您将拥有 1gig 的数据(十个100meg目)
因此,您生成了 10 个 worker 。当它们完成时,将只剩下 1 gig 数据(最后的 10 个网格),但在它们运行时每个使用 300meg(200meg 用于读取 JSON,100meg 用于存储结果)。他们运行时总共有 3 GB 的内存。您可能会用完内存。
假设您只有一个网格处理工作线程和一个工作队列来完成您使用的最多内存是 1.2 gig。工作人员将读取 JSON (200meg) 转换为 Float32Arrays (100meg),将这些 Float32Arrays 传递到主页,然后处理下一个网格。
我看到了3条路径
生成一个 worker 来处理网格。完成后终止它。产生一个新的。
生成一个 worker 不是免费的,因为它每次都必须加载 javascript?
为每个网格生成一个 worker 。
参见上文为什么这可能不是一个好主意
产生一个 worker 并给它一个网格队列来处理。
关于javascript - 在需要时生成 WebWorker 还是重用同一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22513303/