Skip to content

Commit 857c8e9

Browse files
authored
Simplify ImageWorkerManager initialization (#460)
Instead of using an additional postMessage init flow, directly set the variables in the JS Blob before instantiating the worker. Note: CI will fail because of a race condition with 2 tests where the createImageBitmap detection is still happening and an image request is already being made, this will need to be addressed with texture throttling instead of trying to jump through hoops with the current texture source download + ctxCoreContext construction.
2 parents b0685a4 + 081a1b0 commit 857c8e9

File tree

2 files changed

+18
-27
lines changed

2 files changed

+18
-27
lines changed

src/core/CoreTextureManager.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -209,21 +209,16 @@ export class CoreTextureManager extends EventEmitter {
209209
this.hasWorker &&
210210
numImageWorkers > 0
211211
) {
212-
const imageWorkers = new ImageWorkerManager(numImageWorkers, result);
213-
214-
// wait for the image worker manager to be initialized
215-
imageWorkers.once('initialized', () => {
216-
// enable image worker manager
217-
this.imageWorkerManager = imageWorkers;
218-
});
212+
this.imageWorkerManager = new ImageWorkerManager(
213+
numImageWorkers,
214+
result,
215+
);
219216
} else {
220217
console.warn(
221218
'[Lightning] Imageworker is 0 or not supported on this browser. Image loading will be slower.',
222219
);
223220
}
224221

225-
// Do an early init event, we don't need to wait for the image worker manager to be initialized.
226-
// Loading textures will be done on the main thread from this point on until the image worker manager is ready.
227222
this.emit('initialized');
228223
})
229224
.catch((e) => {

src/core/lib/ImageWorker.ts

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
* limitations under the License.
1818
*/
1919

20-
import { EventEmitter } from '../../common/EventEmitter.js';
2120
import type { CreateImageBitmapSupport } from '../CoreTextureManager.js';
2221
import { type TextureData } from '../textures/Texture.js';
2322

@@ -138,14 +137,6 @@ function createImageWorker() {
138137
}
139138

140139
self.onmessage = (event) => {
141-
if (event.data.type === 'init') {
142-
// Store support level sent from the main thread
143-
supportsOptionsCreateImageBitmap = event.data.support.config;
144-
supportsFullCreateImageBitmap = event.data.support.full;
145-
self.postMessage({ initialized: true });
146-
return;
147-
}
148-
149140
var src = event.data.src;
150141
var id = event.data.id;
151142
var premultiplyAlpha = event.data.premultiplyAlpha;
@@ -165,7 +156,7 @@ function createImageWorker() {
165156
}
166157
/* eslint-enable */
167158

168-
export class ImageWorkerManager extends EventEmitter {
159+
export class ImageWorkerManager {
169160
imageWorkersEnabled = true;
170161
messageManager: Record<number, MessageCallback> = {};
171162
workers: Worker[] = [];
@@ -176,7 +167,6 @@ export class ImageWorkerManager extends EventEmitter {
176167
numImageWorkers: number,
177168
createImageBitmapSupport: CreateImageBitmapSupport,
178169
) {
179-
super();
180170
this.workers = this.createWorkers(
181171
numImageWorkers,
182172
createImageBitmapSupport,
@@ -187,12 +177,6 @@ export class ImageWorkerManager extends EventEmitter {
187177
}
188178

189179
private handleMessage(event: MessageEvent) {
190-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
191-
if (event.data?.initialized) {
192-
this.emit('initialized');
193-
return;
194-
}
195-
196180
const { id, data, error } = event.data as ImageWorkerMessage;
197181
const msg = this.messageManager[id];
198182
if (msg) {
@@ -210,7 +194,19 @@ export class ImageWorkerManager extends EventEmitter {
210194
numWorkers = 1,
211195
createImageBitmapSupport: CreateImageBitmapSupport,
212196
): Worker[] {
213-
const workerCode = `(${createImageWorker.toString()})()`;
197+
let workerCode = `(${createImageWorker.toString()})()`;
198+
199+
// Replace placeholders with actual initialization values
200+
const supportsOptions = createImageBitmapSupport.options ? 'true' : 'false';
201+
const supportsFull = createImageBitmapSupport.full ? 'true' : 'false';
202+
workerCode = workerCode.replace(
203+
'var supportsOptionsCreateImageBitmap = false;',
204+
`var supportsOptionsCreateImageBitmap = ${supportsOptions};`,
205+
);
206+
workerCode = workerCode.replace(
207+
'var supportsFullCreateImageBitmap = false;',
208+
`var supportsFullCreateImageBitmap = ${supportsFull};`,
209+
);
214210

215211
const blob: Blob = new Blob([workerCode.replace('"use strict";', '')], {
216212
type: 'application/javascript',

0 commit comments

Comments
 (0)