Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 86b74c3

Browse files
eyebrowsoffireharryterkelsen
authored andcommitted
Properly transfer objects between the main thread and web worker. (#46061)
We need to make sure to add objects to the transfer list when we send them across the ui thread/web worker boundary. Otherwise, they get copied, which is very expensive. On my M1 MacBook Pro, I took measurements of scrolling in the material 3 demo. Before this change, the work on the web worker thread was taking about 25-40ms per frame. After the change, it's around 2ms.
1 parent 12a5d88 commit 86b74c3

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

lib/web_ui/skwasm/library_skwasm_support.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ mergeInto(LibraryManager.library, {
1515
skwasmMessage: 'setAssociatedObject',
1616
pointer,
1717
object,
18-
});
18+
}, [object]);
1919
};
2020
_skwasm_getAssociatedObject = function(pointer) {
2121
return associatedObjectsMap.get(pointer);
@@ -34,11 +34,12 @@ mergeInto(LibraryManager.library, {
3434
associatedObjectsMap.set(data.pointer, data.object);
3535
return;
3636
case 'disposeAssociatedObject':
37-
const object = { data };
37+
const pointer = data.pointer;
38+
const object = associatedObjectsMap.get(pointer);
3839
if (object.close) {
3940
object.close();
4041
}
41-
associatedObjectsMap.delete(data.pointer);
42+
associatedObjectsMap.delete(pointer);
4243
return;
4344
default:
4445
console.warn(`unrecognized skwasm message: ${skwasmMessage}`);
@@ -81,7 +82,7 @@ mergeInto(LibraryManager.library, {
8182
surface: surfaceHandle,
8283
callbackId,
8384
imageBitmap,
84-
});
85+
}, [imageBitmap]);
8586
};
8687
_skwasm_createGlTextureFromTextureSource = function(textureSource, width, height) {
8788
const glCtx = GL.currentContext.GLctx;
@@ -98,10 +99,10 @@ mergeInto(LibraryManager.library, {
9899
GL.textures[textureId] = newTexture;
99100
return textureId;
100101
};
101-
_skwasm_disposeAssociatedObjectOnThread = function(threadId, object) {
102+
_skwasm_disposeAssociatedObjectOnThread = function(threadId, pointer) {
102103
PThread.pthreads[threadId].postMessage({
103104
skwasmMessage: 'disposeAssociatedObject',
104-
object,
105+
pointer,
105106
});
106107
};
107108
},

lib/web_ui/test/ui/image_golden_test.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,17 @@ Future<void> testMain() async {
319319
await completer.future;
320320

321321
final DomImageBitmap bitmap = (await createImageBitmap(image as JSAny))!;
322-
return renderer.createImageFromImageBitmap(bitmap);
322+
323+
expect(bitmap.width.toDartInt, 150);
324+
expect(bitmap.height.toDartInt, 150);
325+
final ui.Image uiImage = await renderer.createImageFromImageBitmap(bitmap);
326+
327+
if (isSkwasm) {
328+
// Skwasm transfers the bitmap to the web worker, so it should be disposed/consumed.
329+
expect(bitmap.width.toDartInt, 0);
330+
expect(bitmap.height.toDartInt, 0);
331+
}
332+
return uiImage;
323333
});
324334
}
325335

0 commit comments

Comments
 (0)