Mapbox 数据下载采用Webworker 技术,在Style构造函数中生成dispatcher,通过调用WorkerPool.acquire() 函数创建webworker,这里mapboxgl.workerUrl 在bundle_prelude中进行了赋值。
WorkerPool: 管理WebWorker池对象,用来获取或者清理WebWorker对象,
成员/函数 | 功能 | 备注 |
active | active:那些资源正在使用 | 其中Dispatcher:id=2 |
workers | workers(WebWorker) | mapboxgl.workerUrl在哪里赋值?? |
release | 当workers未被使用时,可以通过该函数,结束WebWorker线程 | |
isPreloaded | ||
numActive | 正在使用WebWorker池的资源个数 | 一般只有调度使用 |
Scheduler:任务管理
成员/函数 | 功能 | 备注 |
tasks | 任务队列,采用Map的方式,便于查找 | 其中Dispatcher.id=2 |
taskQueue | map Style对象 | 父对象 |
invoker | ThrottledInvoker对象,采用信号量方式,激发任务,类似消费者生成者模式 | 与共享Dispatcher.id=2 |
nextId | WebWorker 接受消息回调函数 | |
add | 添加任务,当为消息类型时,立即执行,并返回。当队列不为空时,立即条用 this.invoker.trigger(),执行process()过程,处理任务。返回值为删除任务函数。 | |
Process | 任务处理过程:去掉为空的任务,找到优先值最小(级别最高的任务),从当前任务队列去删掉,并调用this.invoker.trigger()激活下一次处理。 执行任务函数。 | |
pick | 从当前队列中选择优先级最高的任务 |
Actor:线程工作对象
成员/函数 | 功能 | 备注 |
target | WebWorker对象 | 其中Dispatcher.id=2 |
parent |
webworker线程中Worker对象(src\source\Worker) | 父对象 |
mapId | 与共享Dispatcher.id=2 | |
receive | WebWorker 接受消息回调函数
| |
globalScope | 在主线程中为:window 对象 在WebWorker线程:中为WebWorker对象 | |
callbacks | 如果有回调函数,需要记录回调函数 | |
cancelCallbacks | 任务队列中取消函数 | |
scheduler | 任务管理对象 | |
send | 主线程与Worker线程通信。 生成一个36进制的ID,作为回调函数ID,将处理类型、数据、回调函数等,打包发送通信线程中。返回取消函数 | |
processTask |
Worker: 对象处理函数 checkIfReady\spriteLoaded\setReferrer\setImages\enableTerrain\setLayers\updateLayers\loadTile等,可参考Worker类 |
Dispatcher说明
成员/函数 | 功能 | 备注 |
workerPool | 工作池 | |
actors | 工作线程对象 | |
currentActor | 获取当前工作对象,为了合理分配工作,这里采用交替添加任务。 | |
id | 使用Map资源ID | |
ready | 线程初始化状态 | |
broadcast | 广播 | |
getActor | 获取当前工作对象 | |
remove | 删除工作池 |