我想在Web Worker中处理THREE.Texture,以帮助后期处理效果,例如绽放。例如,对于光晕效果,我首先将场景绘制在THREE.Texture对象上,然后再处理Web Worker中的模糊过程。将THREE.Texture数据传递给工作人员并根据从工作人员获得的数据创建新的THREE.Texture的最有效方法是什么。因为理想情况下每秒要执行60次,所以我需要一种快速且内存友好的方式来做到这一点(内存友好:不是在循环中创建新对象,而是重用现有对象)。
我知道canvas2DContext.getImageData可能会有所帮助,但这可能不是最好的方法,因为我每秒要绘制60次,这会使事情变慢。
谢谢!
PS:我应该指定在这种方法中,我不打算等待工作人员完成纹理处理以呈现最终结果。由于大多数对象都是静态的,所以我认为这并不重要。我想对其进行测试,以查看动态对象的运行情况。
答案 0 :(得分:4)
将基于GPU的纹理传递给Web Worker不会加快任何速度,实际上这会大大降低速度。
相对于在GPU上执行所有操作,将内存从GPU传输到CPU(以及从CPU到GPU)的速度极其慢。将纹理内容传递给工作人员的唯一方法是要求WebGL将GPU中的内容复制到CPU(使用gl.readPixels
封装gl.readPixels
的三个方法),然后传输结果给工人。然后,在worker中,您所能做的就是基于CPU的缓慢模糊处理(比GPU上的处理速度要慢),然后您必须将其传输回主线程,才能通过gl.texImage2D
重新上传或告诉three.js帮您完成,这也是将数据从CPU复制回GPU的缓慢操作。
应用模糊的快速方法是在GPU上进行模糊处理。
此外,无法在主线程和工作线程之间共享WebGL资源,也可能不会很快出现。即使您可以共享资源,然后要求工作人员要求GPU进行模糊处理也不会节省时间,而且在大多数情况下,GPU不会并行运行不同的操作(通常不像CPU这样的多进程)您最终要做的就是要求GPU进行相同数量的工作。