Joe*_*ani 6 javascript performance web-worker
我正在创建一个WebGL游戏,它需要WebWorker进行一些网格处理,以防止主线程滞后.
我的问题 - 最好是在需要时生成/创建新的WebWorkers并在作业完成时终止它们,还是创建一个永久的WebWorker,它在内部对网格处理进行排队?产生(并摧毁)新的WebWorkers会产生很大的开销吗?
在需要时创建它们的主要优点是一次运行多次,没有等待处理的积压,这意味着更快的网格生成.
非常感谢任何建议,以便我可以优化我的代码以获得最佳性能.谢谢!
这不是一个真正的 WebGL 问题,它只是一个一般的 WebWorker 问题。尽管这取决于我的头顶。工人只是线程。如果您的线程在 100% 的时间内都处于忙碌状态(不等待 IO 或用户输入或下一帧),那么一旦线程数多于内核数,您将不会获得任何加速。
换句话说,如果您有 2 个内核,并且每个线程运行 3 个线程而不等待任何东西,那么 1 个内核将在 100% 的时间内运行 1 个线程,另一个内核将在 50% 的时间内运行其他每个线程。总时间将与将 2 个线程合并为 1 个线程的时间相同。
因此,产生大量线程不一定是胜利,并且有一种方法可以在浏览器中的 JavaScript 中查询用户机器的内核数。
最重要的是,您正在处理可能是大数据的网格。假设每个网格在处理时使用 200meg(就像它在 JSON 中一样)和 100meg 在完成时使用(您已经阅读了 JSON 并转换为 Float32Arrays 等。)换句话说,当您完成时,您将拥有 1gig 数据(十个 100meg 目)
所以,你产生了 10 个工人。当它们完成时,将只剩下 1 gig 数据(最后的 10 个网格),但是当它们运行时,每个使用 300meg(200meg 用于读取 JSON,100meg 用于存储结果)。他们运行时总共有 3 演出内存。您可能会耗尽内存。
就好像您只有一个网格处理工作者和一个工作队列来完成您使用的最多内存是 1.2 gig。工作人员将读取 JSON (200meg) 转换为 Float32Arrays (100meg),将这些 Float32Arrays 传递到主页,然后处理下一个网格。
我看到了 3 条路径
产生一个工人来处理网格。完成后终止它。产生一个新的。
生成工人不是免费的,因为它每次都必须加载 javascript?
每个网格产生一个工人。
看看上面为什么这可能不是一个好主意
产生一个工人并给它一个网格队列来处理。