7

我一直在阅读有关 Javascript 语言中的两个(相对)新概念的文章——Web Workers 和 John Resig 的超棒 Processing.js(好吧,并不是一个真正的新“Javascript 概念”,但你明白我的想法)。两者都在互联网上徘徊的一些很好的例子,但我还没有找到一个有效地使用这两种技术的例子。它对我来说看起来很有趣且功能强大,所以我想我最好尝试一下。

但是,我真的想不出将它们两者结合起来的最佳脚本设计……在我看来,通常在使用 Processing.js 时,一些类是“处理应用程序”中定义的。它允许您使用类似 Java 的语法来解决这个问题。然而,这些类只能在处理应用程序中访问——这是显而易见的。但是我们有了 Worker……在这个惊人的例子中,一个 Javascript 函数对象首先在一个单独的脚本中定义,如果需要 Worker 使用,Worker 脚本会导入该对象的原型和某种“螺栓”自己到它上面。

对我来说,这两者似乎不能“互换”,因为当您在 Worker 脚本中时,您无法访问您在 Processing-application 中定义的类。可能是有原因的,因为类处理类绝对不是很像 Javascript。据我所知,我必须在我的 Worker 脚本中对类进行类似的定义(以新函数原型的形式)——这对可维护性不是很好,而且看起来是非常糟糕的设计对我来说,即使我还是这个主题的新手。

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

谢谢您的帮助!

编辑:

继续尝试弄乱 Worker 的原型,以便像它应该为它工作的对象那样“塑造”它,但很快意识到这不是要走的路。

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

没有什么复杂的开始。现在,假设确定球的新位置是一项非常昂贵的操作——例如,如果它涉及球在“复杂”引力场中的运动。如果必须在绘制之前每次都进行此计算,则至少会导致一些延迟。但是,如果您设法同时执行这些操作,则运行可能会更顺畅。所以,我想我可以在它的属性列表中给 Ball 类一个额外的“位置”数组,它将保存它所有的连续位置。当 Ball 被实例化时,它会创建一个新的 Worker,它将开始计算位置,并且每次完成后,它都会向 Ball 回传一条消息,其中包含一个新的二维位置。然后球将把这个推到它的位置数组上,

总而言之——好主意还是坏主意?如果好的话,关于如何设计这个有什么建议吗?

4

5 回答 5

3

3D 游戏物理模拟(如在 xbox360 上)通常以固定速率运行,与帧速率无关。这是因为物理学太复杂而无法进行分析建模,因此您需要进行数值近似,因此您需要确定性地同步误差。额外的好处是帧速率与物理性能解耦,因此您可以以 5hz 更新物理并进行插值等。

因此,您描述的模型正是专业人士的做法。

于 2009-09-01T20:55:04.530 回答
1

当您在 Worker 脚本中时,您无法访问您在 Processing-application 中定义的类。大概是有原因的

这是为了防止由于多个工作人员同时更改相同的共享数据而导致的错误。在消息中,数据被复制,每个 Worker 都有自己的副本,因此不必担心同时写入会导致错误。这是一种避免并发错误的简单方法,无需程序员担心就可以处理它(没有信号量或同步等)

于 2010-11-06T18:27:29.813 回答
0

在这个例子中,位置的计算必须在画球之前完成——所以异步处理没有意义吗?

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

网络工作者也无法访问 dom,因此它们不能用于绘图。

对于像游戏这样更复杂的基于事件的应用程序,网络工作者可能会用到它。

于 2009-08-25T12:20:31.523 回答
0

只是一个想法……但在信号处理中,您所做的是提出一个采样率,将模拟信号分割成数字信息。关键是要保留足够的信号来重新创建原始信号。就像使用 128、192 等从音乐文件中提取 MP3 的方式一样。

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

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

于 2009-09-01T01:28:44.690 回答
0

这个想法让我想起了 Google 的任务队列想法被集成到 Google App Engine 中。

http://code.google.com/appengine/docs/python/taskqueue/

这可能会帮助你。

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

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

于 2009-09-02T14:16:35.757 回答