原文:http://blog.domlib.com/articles/326
在《AS3多线程快速入门》系列教程的第一部分中,我们研究了AS3 Worker的基本原理,包括多种通信方式,还展示了一个简单例子:Hello World Worker。
在这篇文章里,我将更进一步,向你展示如何利用多线程做些有用的功能,比如图像处理!在这次例子中,我将一边给一个大位图应用锐化滤镜,一边让主UI线程持续保持在30fps的渲染帧率。
演示:单线程版本
你可以在下面简单看看我们要做的是什么。这个是没有使用workers的版本,你可以看到:在位图处理过程中Slider完全锁定了无法移动。
注:如果你看不见这个SWF程序,检查下你是否已经下载了Flash Player11.4。如果使用的是谷歌浏览器,别忘了要禁用老版本的插件。
演示:多线程版本
下面是同一个演示程序,但是使用了Worker。你可以看到它的UI渲染流畅地保持在30fps。
注:如果你看不见这个SWF程序,检查下你是否已经下载了Fash Player11.4。如果使用的是谷歌浏览器,别忘了要禁用老版本的插件。
代码
在实际开始写代码前,未雨绸缪下是很重要的。尤其是在处理多线程时,我们确实需要创建一个在worker之间调度数据的高效系统。否则,你的主线程将会因为序列化和反序列化数据造成的巨大开销而陷入困境。
经过一点思考,我决定把这个程序设计成这样:
1.bitmapData通过一个shareable为true的byteArray对象来与worker共享。
2.我们使用bitmapData.setPixels()和bitmapData.copyPixelsToByteArray()方法在bitmapData和byteArray之间来回转换。
3.主线程发出”SHARPEN”命令给worker,然后worker线程在完成时将返回”SHARPEN_COMPELETE”命令。
4.worker线程将使用一个间隔500ms的timer来检测是否需要重新启动一个锐化操作。防止运行过度的锐化操作。
文档类代码
首先是类结构,这里我们将使用和上一个教程里一样方式:用loaderInof.bytes。这个构造函数会被运行两次,第二次运行的是worker,它会创建一个SharpenWorker类的实例,这个实例将负责处理所有与主线程的通信。
12345678910111213public
class
ImageWorkerExample
extends
Sprite
{
public
function
ImageWorkerExample(){
//主线程
if
(Worker.current.isPrimordial){
initUi();
initWorker();
}
//如果不是主线程,就是worker
else
{
sharpenWorker
=new
SharpenWorker();
}
}
在看SharpenWorker类之前,我们先继续读主类。
initUi()方法只是简单地创建了一个slider,一个image,并且添加他们到舞台。这里不需要去关注它。
下一个方法是initWorker(),可以看看代码内的注释。
12345678910111213141516171819202122232425