10.3  执行大计算量任务

10.3 执行大计算量任务

众多程序员,特别是游戏程序员,一直致力于寻求一种高性能的图形渲染方法,而路径查找则是一个非常有用的功能,可以用于创建道路或显示角色从A点到B点的过程。也就是说,路径查找算法就是要在n维(通常是2D或3D)空间中找出两点间的最短路线。

处理路径查找的一种最佳算法叫做A*算法,是迪杰斯特拉(Dijkstra)算法的变体。路径查找(或者类似的计算时间超过数毫秒的操作)的问题在于,它们会导致JavaScript产生一种名为“界面锁定”的效果,也就是在操作完成以前,浏览器将一直被冻结。HTML5规范也提供了一个名为Web Workers的新API。Web Workers(通常称为“worker”)可以让用户在后台执行计算量相对较大以及执行时间较长的脚本,而不会影响浏览器的主用户界面。

创建worker的语法格式如下:

978-7-111-53392-4-Part03-210.jpg

其中的PATHTOAJSSCRIPT可以是一个脚本文件,比如astar.js。在创建了worker之后,随时可以调用worker.close()终止它的执行。如果终止了一个worker,然后又需要执行一个新操作,那就得再创建一个新的worker对象。在Web Workers之间的通信,是通过在worker.onmessage事件的回调函数中调用worker.postMessage(object)来实现的。此外,还可以通过onerror事件处理程序来处理worker的错误。与普通的网页类似,Web Workers也支持引入外部脚本,使用的是importScripts()函数。此函数可以接受0个或多个参数,如果有参数,每个参数都应该是一个JavaScript文件。

下面通过一个实例讲解使用Web Workers API执行大计算量任务的方法。

978-7-111-53392-4-Part03-211.jpg

在本实例的HTML 5页面中,定义了一个用JavaScript实现的A*算法,在实现过程中使用了Web Worders。实例文件5.html的实现代码如下。

978-7-111-53392-4-Part03-212.jpg

978-7-111-53392-4-Part03-213.jpg

978-7-111-53392-4-Part03-214.jpg

978-7-111-53392-4-Part03-215.jpg

脚本文件js5.js的代码如下。

978-7-111-53392-4-Part03-216.jpg

978-7-111-53392-4-Part03-217.jpg

978-7-111-53392-4-Part03-218.jpg

978-7-111-53392-4-Part03-219.jpg

执行后的效果如图10-5所示。

978-7-111-53392-4-Part03-220.jpg

图10-5 执行效果