Javascript 结合Processing.js和Web Workers的强大功能

Javascript 结合Processing.js和Web Workers的强大功能,javascript,processing.js,web-worker,Javascript,Processing.js,Web Worker,我一直在阅读Javascript语言中的两个(相对而言)新概念——Web Workers和John Resig的awesome Processing.js(虽然不是一个新的“Javascript概念”,但你明白我的意思)。这两种技术都有一些很好的例子出现在互联网上,但我还没有找到一种能有效地运用这两种技术的。对我来说,它看起来非常有趣和强大,所以我想我最好试试 然而,我真的不能找出最好的脚本设计来整合他们两个。。。在我看来,通常在使用Processing.js时,一些类是在“处理应用程序”中定义

我一直在阅读Javascript语言中的两个(相对而言)新概念——Web Workers和John Resig的awesome Processing.js(虽然不是一个新的“Javascript概念”,但你明白我的意思)。这两种技术都有一些很好的例子出现在互联网上,但我还没有找到一种能有效地运用这两种技术的。对我来说,它看起来非常有趣和强大,所以我想我最好试试

然而,我真的不能找出最好的脚本设计来整合他们两个。。。在我看来,通常在使用Processing.js时,一些类是在“处理应用程序”中定义的。它允许您使用类似Java的语法来实现这一点。但是,这些类只能在处理应用程序中访问——这是显而易见的。但是我们还有工人。。。在一个令人惊讶的例子中,Javascript函数对象首先在一个单独的脚本中定义,如果需要使用Worker,Worker脚本会将该对象的原型和某种“螺栓”本身导入其中

对我来说,这两者似乎并不“可互换”,因为当您在工作脚本中时,您无法访问在处理应用程序中定义的类。可能是有原因的,因为类处理类肯定不是很像Javascript。就我所见,我必须在我的工作脚本中对类做一个类似的定义(以新函数原型的形式),这对可维护性不是很好,对我来说似乎是非常糟糕的设计,尽管我在这方面还是个新手

我是不是忽略了什么?我想要不该有的东西吗?还是我只是误解了一些基本概念

谢谢你的帮助

编辑:

继续尝试弄乱工人的原型,以便将其“塑造”成它应该为之工作的对象,但很快意识到这不是正确的做法

让我们尝试使用一个提纲: 我有一个类“Ball”,它除了存储二维位置外几乎什么都不做。在每个
draw()
循环中,Processing.js调用其
update()
方法,使球采用新的位置。然后,调用
display()
方法,使球在其当前位置上画一个小圆

一开始没什么复杂的。现在,假设确定球的新位置是一项非常昂贵的操作——例如,如果它涉及到球在“复杂”引力场中的运动。如果必须在每次绘图之前进行此计算,则至少会造成一些延迟。然而,如果你能同时做到这一点,它可能会运行得更平稳。因此,我发现我可以在Ball类的属性列表中给它一个额外的“positions”数组,它将保存它的所有连续位置。当球被实例化时,它将创建一个新的辅助对象,该辅助对象将开始计算位置,每次完成一个辅助对象后,它都会向球发回一条消息,其中包含一个新的二维位置。然后球会将这个球推到它的位置数组上,所以每次它必须更新它的位置时,它只会走到数组中的下一条记录


总而言之,好主意还是坏主意?如果好的话,有没有关于如何设计的建议?

在本例中,位置的计算必须在绘制球之前完成-因此异步处理没有意义

p5本身是非常同步的——有一种中心绘制方法可以完成所有的绘制

此外,web工作人员无法访问dom,因此不能将其用于绘图

对于更复杂的、基于事件的应用程序(如游戏),网络工作者可以使用它。

只是一个想法……但你要做的是拿出一个采样率,将模拟信号分割成数字信息。关键是要保留足够的信号以重现原始图像。就像使用128、192等从音乐文件中提取MP3一样

因此,如果您以数学上可定义的方式(即沿抛物线)移动球,您应该能够将路径转换为一组近似模拟路径的坐标。这些坐标比完整路径的计算速度要快得多。它也是可调的(通过改变采样率)

我知道这并不能解决您关于Processing.js或Web Workers的任何问题。这只是一个帮助您更高效地执行这些计算的想法。

3D游戏物理模拟人生(如xbox360上的模拟人生)通常以固定速率运行,与帧速率无关。这是因为物理太复杂了,无法用解析的方法建模,所以需要进行数值近似,所以需要确定地同步误差。另外一个好处是帧速率与物理性能不耦合,所以您可以在5hz频率下更新物理,并进行插值等


因此,您描述的模型正是专业人士如何做到这一点的。

这个想法让我想起了谷歌的任务队列思想被集成到谷歌应用程序引擎中

这可能对你有所帮助

对于我的异步在线棋盘游戏,我将实现一个系统,其中保存消息的历史记录,以便玩家可以在轮到他们时看到发生了什么。发生的每件事都会得到一个唯一的ID,每当玩家收到任何消息时,它都会跟踪他们收到的最新消息。然后,当他们回来时,他们可以看到从他们收到的最后一条消息中发生的所有事情的快速动画

如果我需要服务器在客户端不等待的情况下处理某些事情,我将使用任务队列

无法访问在处理应用程序中定义的类, 当您在工作脚本中时。可能是有原因的

这是为了防止由于多个工作人员更改sam而导致的错误