Jon*_*Jon 5 multithreading pthreads box2d game-physics
所以我基本上试图实现一个AIR Native Extension,它通过Actionscript在C中进行物理模拟.
我已经经历了很多次迭代,为了感兴趣,我将在下面列出,我认为这是我最终尝试以更高效的方式工作.
最后,我正在寻找帮助,我应该如何设置一个线程环境,在单独的线程上运行Box2D的模拟,然后轮询AS3中的状态.
方法:
在这个方法中,我只是从AS3调用C并告诉它创建一个世界并传递一些框来添加到这个世界.在AS3的每一帧中,我调用C来告诉世界Step,然后循环遍历World中的所有body,获取它们的位置和旋转,将它们转换为actionscript对象并将它们放入actionscript数组然后将其发送回AS3.在那里,我遍历返回的数组并将这些位置和旋转值分配给我的精灵,以便它们可视地更新.
结果实际上相当不错,在帧速率受到影响之前添加了大约116个盒子.这与纯AS3实现中的30个盒子相比.请注意,这些统计信息处于调试模式.在发布模式下,它们都可以使用大约120个盒子.AS3实现与Native Extension实现之间几乎没有区别.
为了提高性能,我决定尝试限制在C和AS3上编组的数据量是个好主意.ANE支持共享一个字节数组的内存空间,因此我将在AS3中创建的ByteArray发送给C并让C简单地更新ByteArray.这使我们不必在C中构造AS3对象并将其传回.每一帧,AS3只需迭代它的ByteArray,看看C写入了什么,然后将这些值分配给精灵来设置视觉状态.
这里的结果遗憾地大致相同.改进只是微不足道的.
ANE能够做的另一件事是设置AS3中对象的属性.在这个意义上,我的目的是消除将数据传递回AS3的开销,循环通过主体收集C中的数据以及在AS3中循环以分配值.我直接修改了Box2D代码,这样当它的值被改变时,它会直接在相应的Sprite上写入新的x,y,旋转值.
由于设置这些属性的调用远低于毫秒,因此在非常少量的对象中结果令人惊讶.问题是,这会线性地扩展到大约90个左右的对象,开销太严重而且事情开始变慢.
在这一点上,我有点难过.编组数据存在开销,C中有成本用于迭代和构造要返回的数据,AS3中有成本用于迭代为精灵分配值.
显然需要进行权衡,所以我目前的解决方案是我现在能想到的最好的解决方案.
在AS3方面,你打电话给C来创建你的世界,打电话给那个世界添加一个盒子,然后打电话告诉你想要刷新你的数据.当在AS3中创建框时,它们将获得唯一的ID,并将它们存储在字典中,其中密钥为id.
在C方面,创建了世界,并生成了一个新的pthread来执行Step.基本上在另一个线程上模拟世界.在它执行之后,它组装所有数据并将其写入双数组.然后它一次又一次地这样做.它只是基本上模拟它自己的线程.
当我们呼叫C添加一个新框时,我需要创建一个新框并将其添加到该世界.由于世界是步进,这可能会导致问题,这意味着我需要使用互斥锁,我很确定.
当我们调用AIR中刷新的值时,我会想要从双精度数组中执行memcpy到AS3 bytearray中,然后遍历bytearray来设置视觉上的值.
互斥体给了我麻烦所以我基本上实现了我自己,你可以在下面看到...并笑:)
然而它确实有效,只是没有我想要的那么快.大约90后我们再次放慢速度.
有人有任何想法或指示?非常感谢!
C代码
解析器正在运行,所以我在这里粘贴它:http: //pastebin.com/eBQGuGJX
AS3代码
解析器也是如此.我只包含处理AS3中每个帧的相关方法. http://pastebin.com/R1Qs2Tyt
我忘记了我有这个问题。幸运的是我已经想通了。
使用互斥体等的想法一开始就被过度设计并且没有必要。
由于我们在 Flash 中运行,所以一切都在主线程中运行。这意味着对于每个“帧”,Flash 将本机处理任何媒体,然后是我们编写的客户端代码,然后实际渲染到屏幕,最后在必要时进行垃圾收集。
我实际上并不需要永远模拟物理模拟,我只需要让它比我的客户端代码领先一步。
现在发生的情况是,当客户端调用 ANE 来设置世界时,它会创建一个模拟世界的新线程并立即返回到 Flash。Flash 将继续执行其余客户端代码、渲染和 GC 的工作。
然后,在 Flash 中的每一帧上,我们可以简单地调用 ANE 来检索结果。在模拟线程未完成的情况下,我们通过连接等待,提取值并将它们返回到 Flash。当然,确保在返回之前为下一步生成另一个线程。
通过这种方式,我们可以最大限度地提高效率,因为模拟是在 Flash 忙于执行其他我们无法控制的事情(如渲染和 GC)时进行的。
好消息是,采用这种方法,性能几乎翻倍。从同步纯 AS3 实现中的约 90 个框到线程 ANE 方法中的约 170 个框。
瓶颈最终成为从 ANE 返回的数据的迭代并将这些值分配给显示对象。
我希望这可以帮助其他正在寻找类似东西的人。我将在 4 月底在 FITC 多伦多会议上就此发表演讲,以便届时我可以发布更多信息和材料。
http://www.fitc.ca/events/presentations/presentation.cfm?event=124&presentation_id=1973