结合 Processing.js 和 Web Workers 的威力

7
我最近在阅读关于Javascript语言中的两个(相对)新概念-Web Workers和John Resig的Processing.js(虽然不是真正的新“Javascript概念”,但你明白我的意思)。有很多优秀的例子都可以在互联网上找到,但我还没有找到一个有效地结合了这两种技术的例子。这对我来说似乎非常有趣和强大,因此我认为我最好试一试。
然而,我真的无法想出最佳脚本设计来集成它们两个...似乎通常情况下,当使用Processing.js时,一些类被定义在“Processing应用程序”内部。它允许您使用类似Java的语法来处理此问题。但是,这些类只能在Processing应用程序内部访问-这是显而易见的。但是我们有了Workers...在这个惊人的例子中,首先在单独的脚本中定义了一个Javascript函数对象,如果需要使用Worker,则Worker脚本导入该对象的原型并将其“螺栓”到该对象上。
对我来说,两者似乎不是“可互换的”,因为当您在Worker脚本中时,无法访问您在Processing应用程序中定义的类。很可能有一个原因,因为类似处理的类绝对不像Javascript。据我所见,我将不得不在我的Worker脚本中进行类似的定义(以新函数原型的形式)-这对可维护性来说并不是很好,并且对我来说只是非常糟糕的设计,尽管我在这个主题上仍然是一个大新手。
我有什么遗漏吗?我想要的东西可能根本不存在吗?还是我误解了一些基本概念?
谢谢帮助!
编辑:
随后尝试混淆Worker的原型,以便将其“塑造”成它应该为之工作的对象,但很快就意识到这不是正确的方法。
让我们尝试一个大纲: 我有一个名为“Ball”的类,除了存储二维位置外,几乎什么都不做。在每个draw()周期上,Processing.js调用它的update()方法,使Ball采用新的位置。之后,调用display()方法,Ball在其当前位置画一个小圆。

一开始并不复杂。现在,假设确定球的新位置是一个相当昂贵的操作 - 例如,如果它涉及到将球移动通过一个“复杂”的重力场。如果每次绘制之前都必须进行这个计算,那么至少会有一些延迟。然而,如果您能够同时完成这些工作,它可能会更加流畅。因此,我想出了一个办法,可以在Ball类的属性列表中添加一个额外的“positions”数组,该数组将保存其所有连续位置。当Ball被实例化时,它会创建一个新的Worker来开始计算位置,并且每次完成一个位置时,它都会向Ball发送一条消息,其中包含一个新的二维位置。然后,Ball将把这个位置推送到其位置数组中,所以每次更新其位置时,它只需走到数组中的下一个记录。

总的来说 - 是好还是坏的想法?如果是好的,对于如何设计它有什么建议吗?

5个回答

3

3D游戏物理模拟(如Xbox360上的)通常以固定速率运行,与帧率无关。这是因为物理过于复杂,无法通过分析建模,所以需要进行数值近似,因此需要确定性地同步误差。另一个好处是帧率与物理性能解耦,因此可以以5hz更新物理并进行插值等操作。

因此,您描述的模型正是专业人士所使用的模型。


1
  • 在工作脚本中,您无法访问在处理应用程序中定义的类。这可能是有原因的。
  • 这是为了防止多个工作者同时更改相同共享数据而导致错误。在消息中,数据被复制并且每个工作者都有自己的副本,因此它不必担心同时写入导致错误。这是一种简单的方法来避免并发错误,可以处理它而无需程序员担心(没有信号量或同步等)。

  • 0
    在这个例子中,在绘制球之前必须完成位置的计算 - 所以异步处理没有意义吗? p5 本身非常同步 - 只有一个中央的 draw 方法来完成所有的绘制。
    此外,Web Worker 无法访问 DOM,因此它们不能用于绘图。
    对于更复杂、基于事件的应用程序(如游戏),可以使用 Web Worker。

    不,情况并非如此-当绘图初始化时,工作线程开始计算位置,并且每次发现新位置时,都会提交给主线程。在那里,它被存储在一种“缓存”数组中,以便以后使用。但是,计算在绘制发生时继续进行,因此每帧没有延迟,也没有启动前的延迟。 - JorenB

    0

    只是一种想法......在信号处理中,你要做的是制定一个样本率,将模拟信号切成数字信息。关键是保留足够的信号以重新创建原始信号。就像从音乐文件中使用128、192等剪切出MP3一样。

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

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


    在提交这个答案之前,我不理解Processing.js是什么。我很确定我提供的任何帮助都是基于错误的理解。看起来Processing.js已经很好地完成了我上面描述的信号处理概念。 - Rake36

    0
    这个想法让我想起了谷歌的任务队列想法被整合到谷歌应用引擎中。

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

    这可能会对你有所帮助。

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

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接