当前位置: 首页 > 工具软件 > Mapbox GL JS > 使用案例 >

Mapbox-gl-js 调度管理—Dispatcher

钱旻
2023-12-01

     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

  1. 主线程中parent 为 map Style对象.

webworker线程中Worker对象(src\source\Worker

父对象

mapId

与共享Dispatcher.id=2

receive

WebWorker 接受消息回调函数

  1. 如果id 为空返回。
  2. 如果类型为取消,则从任务队列中移除。
  3. 如果数据需要排队,并且在webworker线程中,添加到任务队列。
  4. 否则直接调用processTask函数

globalScope

在主线程中为:window 对象

WebWorker线程:中为WebWorker对象

callbacks

如果有回调函数,需要记录回调函数

cancelCallbacks

任务队列中取消函数

scheduler

任务管理对象

send

主线程与Worker线程通信。

生成一个36进制的ID,作为回调函数ID,将处理类型、数据、回调函数等,打包发送通信线程中。返回取消函数

processTask

  1. 如果任务为<response>,从回调队列取出回调函数,调用回调。
  2. 如果在parent=worker对象中存在相应任务类型(函数)或者数据源,则执行相应的处理函数,否则返回报错信息

Worker: 对象处理函数

checkIfReady\spriteLoaded\setReferrer\setImages\enableTerrain\setLayers\updateLayers\loadTile等,可参考Worker类

Dispatcher说明

成员/函数

功能

备注

workerPool

工作池

actors

工作线程对象

currentActor

获取当前工作对象,为了合理分配工作,这里采用交替添加任务。

id

使用Map资源ID

ready

线程初始化状态

broadcast

广播

getActor

获取当前工作对象

remove

删除工作池

 类似资料: