skia2/demos.skia.org/demos/path_performance/worker.js

55 lines
2.0 KiB
JavaScript
Raw Normal View History

importScripts('https://unpkg.com/canvaskit-wasm@0.25.0/bin/full/canvaskit.js');
importScripts('shared.js');
const CanvasKitPromise =
CanvasKitInit({locateFile: (file) => 'https://unpkg.com/canvaskit-wasm@0.25.0/bin/full/'+file});
const path2dAnimator = new Animator();
const canvasKitAnimator = new Animator();
addEventListener('message', async ({ data: {svgData, offscreenCanvas, type, switchMethod} }) => {
// The worker expect to receive 2 messages after initialization: One with an offscreenCanvas
// for Path2D rendering, and one with an offscreenCanvas for CanvasKit rendering.
if (svgData && offscreenCanvas && type) {
if (type === 'Path2D') {
path2dAnimator.renderer =
new Path2dRenderer(svgData, offscreenCanvas);
}
if (type === 'CanvasKit') {
const CanvasKit = await CanvasKitPromise;
canvasKitAnimator.renderer =
new CanvasKitRenderer(svgData, offscreenCanvas, CanvasKit);
}
}
// The worker receives a "switchMethod" message whenever the user clicks a rendering
// method button on the web page.
if (switchMethod) {
// Pause other renderers and start correct renderer
canvasKitAnimator.stop();
path2dAnimator.stop();
if (switchMethod === 'Path2D') {
path2dAnimator.start();
} else if (switchMethod === 'CanvasKit') {
canvasKitAnimator.start();
}
}
});
// Report framerates of Path2D and CanvasKit rendering back to main.js
setInterval(() => {
if (path2dAnimator.framesCount > 0) {
postMessage({
renderMethod: 'Path2D',
framesCount: path2dAnimator.framesCount,
totalFramesMs: path2dAnimator.totalFramesMs
});
}
if (canvasKitAnimator.framesCount > 0) {
postMessage({
renderMethod: 'CanvasKit',
framesCount: canvasKitAnimator.framesCount,
totalFramesMs: canvasKitAnimator.totalFramesMs
});
}
}, 1000);