原文:http://blog.domlib.com/articles/345
[更新]Adobe在11.4正式发布的最后一刻移除了ByteArray.shareable功能的支持,推迟到11.5版本再发布。为了解决这个问题,源码已经被我更新过了。但这里还是留下完整的示例代码,因为它能最终会正常运行的。
在《AS3多线程快速入门》系列教程的第一部分中,我们研究了AS3 Worker的基本原理,包括多种通信方式,还展示了一个简单例子:Hello World Worker。
在系列教程的第二部分中,我们研究了在一个在独立线程里执行图像处理的例子。
在这教程的最后一部分里,我将介绍如何在一个单独的线程运行你的物理引擎,然后我们再混合一点Starling作为锦上添花的东西。
首先,让我看看我们将要做的东西是什么:
多线程版本演示地址:http://esdot.ca/examples/NapeWorkerExample.html
作为对比,让我再看看传统的单线程版本执行效果:
单线程版本演示地址:http://esdot.ca/examples/NapeLegacyExample.html
在大多数电脑上,你的CPU满负荷工作情况下,单线程版本的测试将难以达到45fps。即使你有一个性能超级高的CPU,让帧率接近了60fps,你的CPU仍然是满负荷的。你将没有任何空余的时间片来处理游戏中的其他操作。相比之下,使用多线程的版本,在CPU上几乎没有时间占用,它仅花了小于1ms的时间在反序列化数据和一系列向Starling推送数据的操作上。有这么多的空闲时间它都可以抽根烟休息一下了!
概述
首先简要概述下它是如何运行的:
1.Nape的物理模拟将会完全运行在Worker线程内部。
2.当主线程想要添加一个物理对象时,就调用Worker线程。
3.每一帧,Worker线程都会复制所有物理对象的位置数据到共享的ByteArray里。
4.主线从ByteArray对象里读取位置数据,并使用它们来更新屏幕上的Sprite对象位置。
我们先从文档类开始,看看发送给Worker线程的信息。然后再看下Worker内部实际运行的物理引擎代码。
文档类代码
第一步是创建Worker和一些MessageChannels对象,让我们能够通信。
到现在,你应该对基于Worker的应用程序的代码模板比较熟悉了吧:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455public
function
NapeWorkerExample()
{
registerClassAlias(
"SpritePosition"
,
SpritePosition);registerClassAlias(
"Rectangle"
,
Rectangle);
if
(Worker.current.isPrimordial){
stage.frameRate
=60
;
//创建worker