请求池管理器
请求池管理器经过了大幅重构,带来两项新能力:
1)影像的异步获取与解码;2)请求重排序。
ImageLoad 与 ImageRetrieval 两个队列
以前,获取和解码影像共用一个加载队列。只有当影像解码完成之后, 才会发起新的请求。这在解码比较耗时的场景下形成了一个约束: 即使按配置的最大请求数还允许发出更多请求,也不会有新的获取(fetch)请求被发出。
为了突破这个限制,我们为此创建了两个彼此独立的队列:
imageRetrievalPoolManager 和 imageLoadPoolManager,
各自拥有可配置的最大并发任务数。它们相互分离、异步执行,
这样只要有请求发射位空出来,每个获取请求就能立刻被发起。
把影像获取请求与解码拆开这一行为,在 Cornerstone-wado-image-loader
v4.0.0-rc 及以上版本中默认启用。
// 加载 = 获取 + 解码
imageLoadPoolManager.maxNumRequests = {
interaction: 1000,
thumbnail: 1000,
prefetch: 1000,
};
// 获取(通常)=== XHR 请求
imageRetrievalPoolManager.maxNumRequests = {
interaction: 20,
thumbnail: 20,
prefetch: 20,
};
用法
在你自定义的 imageLoader 或 volumeLoader 中,
要正确使用 cornerstone 内部的这些池管理器,需要定义一个 sendRequest 函数
来发起加载影像的请求。
import {
imageLoadPoolManager,
loadAndCacheImage,
RequestType,
} from '@cornerstonejs/core';
function sendRequest(imageId, imageIdIndex, options) {
return loadAndCacheImage(imageId, options).then(
(image) => {
// 渲染
successCallback.call(this, image, imageIdIndex, imageId);
},
(error) => {
errorCallback.call(this, error, imageIdIndex, imageId);
}
);
}
const imageId = 'schema://image';
const imageIdIndex = 10;
const requestType = RequestType.INTERACTION;
const priority = -5;
const additionalDetails = { imageId };
const options = {
targetBuffer: {
type: 'Float32Array',
},
};
imageLoadPoolManager.addRequest(
sendRequest.bind(this, imageId, imageIdIndex, options),
requestType,
additionalDetails,
priority
);
请求重排序
你可能对影像的获取顺序有特定要求。例如希望从中间那张切片开始、
向上下两端加载一份体数据。这个选项我们已经在
cornerstoneStreamingImageVolumeLoader 中实现了,
详见请求重排序一节。