diff --git a/adapters/common/worker/cache-manager-proxy.js b/adapters/common/worker/cache-manager-proxy.js index 2a02d207..d186d59b 100644 --- a/adapters/common/worker/cache-manager-proxy.js +++ b/adapters/common/worker/cache-manager-proxy.js @@ -111,19 +111,19 @@ var cacheManager = { init() { this._cacheDir = getUserDataPath() + '/' + this.cacheDir; - worker.cacheManager.init(null, ([cachedFiles]) => { + worker.cacheManager.init(([cachedFiles]) => { this.cachedFiles = new cc.AssetManager.Cache(cachedFiles); }); }, clearCache() { - worker.cacheManager.clearCache(null, () => { + worker.cacheManager.clearCache(() => { this.cachedFiles.clear(); }); }, clearLRU() { - worker.cacheManager.clearLRU(null, ([deletedFiles]) => { + worker.cacheManager.clearLRU(([deletedFiles]) => { for (let i = 0, l = deletedFiles.length; i < l; i++) { this.cachedFiles.remove(deletedFiles[i]); } diff --git a/adapters/platforms/wechat/res/workers/audio-worker.js b/adapters/platforms/wechat/res/workers/audio-worker.js index 5df876b5..4f3980a1 100644 --- a/adapters/platforms/wechat/res/workers/audio-worker.js +++ b/adapters/platforms/wechat/res/workers/audio-worker.js @@ -5,7 +5,7 @@ var audio_worker = { map: {}, timer: null, - create(callback, id) { + create(id) { this.map[id] = { audio: worker.createInnerAudioContext({ useWebAudioImplement: true }), cache: { @@ -20,7 +20,7 @@ var audio_worker = { } }, - call(callback, id, type, arg) { + call(id, type, arg) { const audio = this.map[id].audio; switch (type) { case 0: @@ -73,20 +73,20 @@ var audio_worker = { } }, - on(callback, id, type) { + on(id, type) { const data = this.map[id]; data.audio["on" + type]((data.callbacks[type] = data => { main.audioAdapter.onCallback(id, type, data); })); }, - off(callback, id, type) { + off(id, type) { const data = this.map[id]; data.audio["off" + type](data.callbacks[type]); delete data.callbacks[type]; }, - destroy(callback, id) { + destroy(id) { this.map[id].destroy(); delete this.map[id]; }, diff --git a/adapters/platforms/wechat/res/workers/cache-manager-worker.js b/adapters/platforms/wechat/res/workers/cache-manager-worker.js index 05936748..16f23e99 100644 --- a/adapters/platforms/wechat/res/workers/cache-manager-worker.js +++ b/adapters/platforms/wechat/res/workers/cache-manager-worker.js @@ -88,12 +88,12 @@ var cacheManager_worker = { }, download( - callback, url, options_reload, options_header, options_cacheEnabled, options___cacheBundleRoot__, + callback, ) { var result = this.transformUrl(url, options_reload); if (result.inLocal) { @@ -109,17 +109,17 @@ var cacheManager_worker = { return; } this.tempFiles[url] = path; - this.cacheFile(null, url, path, options_cacheEnabled, options___cacheBundleRoot__, true); + this.cacheFile(url, path, options_cacheEnabled, options___cacheBundleRoot__, true); callback(null, path); }); } }, handleZip( - callback, url, options_header, options___cacheBundleRoot__, + callback, ) { let cachedUnzip = this.cachedFiles[url]; if (cachedUnzip) { @@ -138,7 +138,7 @@ var cacheManager_worker = { } }, - getTemp(callback, url) { + getTemp(url, callback) { callback(this.tempFiles.has(url) ? this.tempFiles.get(url) : ''); }, @@ -208,7 +208,7 @@ var cacheManager_worker = { checkNextPeriod = false; }, - cacheFile(callback, id, srcUrl, cacheEnabled, cacheBundleRoot, isCopy) { + cacheFile(id, srcUrl, cacheEnabled, cacheBundleRoot, isCopy, callback) { cacheEnabled = cacheEnabled != null ? cacheEnabled : this.cacheEnabled; if (!cacheEnabled || this.cacheQueue[id] || this.cachedFiles[id]) { if (callback) callback(null); @@ -293,7 +293,7 @@ var cacheManager_worker = { }); }, - removeCache(callback, url) { + removeCache(url, callback) { if (this.cachedFiles[url]) { var self = this; var path = this.cachedFiles[url].url; diff --git a/adapters/platforms/wechat/res/workers/index.js b/adapters/platforms/wechat/res/workers/index.js index 190af0ef..fec2f52f 100644 --- a/adapters/platforms/wechat/res/workers/index.js +++ b/adapters/platforms/wechat/res/workers/index.js @@ -1,6 +1,14 @@ require("./macro.js"); const { init } = require("./ipc-worker.js"); +const { CC_CUSTOM_WORKER } = globalThis; init(() => { require("./handlers.js"); + if (CC_CUSTOM_WORKER) { + try { + require("./custom/index.js"); + } catch (error) { + console.error("worker init custom extension error:", error); + } + } }); diff --git a/adapters/platforms/wechat/res/workers/ipc-worker.js b/adapters/platforms/wechat/res/workers/ipc-worker.js index 9271c2c3..9cf08795 100644 --- a/adapters/platforms/wechat/res/workers/ipc-worker.js +++ b/adapters/platforms/wechat/res/workers/ipc-worker.js @@ -7,10 +7,10 @@ // 1.在 worker 端调用 registerHandler(name, obj) 注册处理对象。 // 2.所有非函数属性会生成 `get_xxx()`、`set_xxx(v)`、`write_xxx(v)` 三个函数, // 其中,`write_` 函数会在设置完毕后回调到主线程。 -// 3.所有函数属性请确保第一个参数是 callback,用于回调到主线程, +// 3.在函数被调用时,会在最后一个参数传入 callback,用于回调结果到主线程, // 用法是 callback(...args)。 // -// 注册好函数后,在主线程通过 worker.name.key(args | null, (args)=>{}) 调用。 +// 注册好函数后,在主线程通过 worker.name.key(args, args => {}) 或 worker.name.key(args => {}) 调用。 // 注意在主线程调用时传入和返回的都是参数数组。 // // - 从 Worker 调用 主线程: @@ -19,9 +19,9 @@ // 1.在 main 端调用 registerHandler(name, obj) 注册处理对象。 // 2.所有非函数属性会生成 `get_xxx()`、`set_xxx(v)`、`write_xxx(v)` 三个函数, // 其中,`write_` 函数会在设置完毕后回调到 Worker。 -// 3.所有函数属性请确保参数是 [args, cmdId, callback],用于回调到 Worker, +// 3.所有函数属性请确保参数是 [args, cmdId, callback],callback 用于回调到 Worker, // 用法是 callback(cmdId, args)。 -// 注意在主线程回调时传入的是参数数组。 +// 注意主线程注册的函数、callback 传入的都是参数数组。 // // 注册好函数后,在 Worker 通过 main.name.key(...args, (...args)=>{}) 调用。 // 最后一个参数如果是函数的话则会当作 callback 处理。 @@ -83,10 +83,10 @@ function registerHandler(name, obj) { key, func: (id, cmd, args) => { obj[key]( + ...(args ? args : []), (...args) => { callbackToMain(id, cmd, args); }, - ...(args ? args : []), ); }, }; @@ -232,5 +232,13 @@ const sendScheduler = { }; const main = {}; +const ipcWorker = { + get inited() { + return _inited; + }, + main, + init, + registerHandler, +}; -module.exports = { init, registerHandler, main }; +module.exports = ipcWorker; diff --git a/adapters/platforms/wechat/res/workers/macro.js b/adapters/platforms/wechat/res/workers/macro.js index d54c6e0b..45b73fad 100644 --- a/adapters/platforms/wechat/res/workers/macro.js +++ b/adapters/platforms/wechat/res/workers/macro.js @@ -1,9 +1,12 @@ -// 是否启用 Worker 调度模式,这会减少通信次数(必须一致) +// 是否启用 Worker 调度模式,这会减少通信次数 globalThis.CC_WORKER_SCHEDULER = true; // 是否启用 Worker 调试模式 globalThis.CC_WORKER_DEBUG = false; +// 是否启用自定义 Worker +globalThis.CC_CUSTOM_WORKER = false; + // --- 以下从主线程同步值 --- // 是否启用 Worker 使用同步版本的文件系统 API diff --git a/adapters/platforms/wechat/worker/ipc-main.js b/adapters/platforms/wechat/worker/ipc-main.js index 872fbb85..9845eb62 100644 --- a/adapters/platforms/wechat/worker/ipc-main.js +++ b/adapters/platforms/wechat/worker/ipc-main.js @@ -121,7 +121,11 @@ const ipcMain = { worker[name] = {}; } worker[name][key] = (args, callback) => { - this.callToWorker(cmd, args, callback); + if (typeof args === "function") { + this.callToWorker(cmd, null, args); + } else { + this.callToWorker(cmd, args, callback); + } }; } diff --git a/adapters/platforms/wechat/worker/macro.js b/adapters/platforms/wechat/worker/macro.js index 73137890..2b882616 100644 --- a/adapters/platforms/wechat/worker/macro.js +++ b/adapters/platforms/wechat/worker/macro.js @@ -28,9 +28,14 @@ if (!("CC_WORKER_AUDIO_SYSTEM_SYNC_INTERVAL" in globalThis)) { globalThis.CC_WORKER_AUDIO_SYSTEM_SYNC_INTERVAL = 500; } +// 是否启用自定义 Worker +if (!("CC_CUSTOM_WORKER" in globalThis)) { + globalThis.CC_CUSTOM_WORKER = false; +} + // 是否启用 Worker if (!("CC_USE_WORKER" in globalThis)) { - globalThis.CC_USE_WORKER = (CC_WORKER_ASSET_PIPELINE || CC_WORKER_AUDIO_SYSTEM) && hasWorker && !isSubContext; + globalThis.CC_USE_WORKER = (CC_WORKER_ASSET_PIPELINE || CC_WORKER_AUDIO_SYSTEM || CC_CUSTOM_WORKER) && hasWorker && !isSubContext; } // 是否启用 Worker 调试模式 @@ -38,7 +43,7 @@ if (!("CC_WORKER_DEBUG" in globalThis)) { globalThis.CC_WORKER_DEBUG = false; } -// 是否启用 Worker 调度模式,这也许能减少通信次数带来的性能消耗(必须一致) +// 是否启用 Worker 调度模式,这也许能减少通信次数带来的性能消耗 globalThis.CC_WORKER_SCHEDULER = true; // 是否启用 Worker 使用同步版本的文件系统 API diff --git a/creator-sp.d.ts b/creator-sp.d.ts index bc5f6bce..64c75f66 100644 --- a/creator-sp.d.ts +++ b/creator-sp.d.ts @@ -935,3 +935,54 @@ declare module sp { } +/** + * 访问 Worker 的入口 + */ +declare const worker: any; + +declare module ipcMain { + /** + * 注册 Worker 可以访问的入口 + */ + export function registerHandler(name: string, handler: object): Promise; +} + +/** + * 是否启用 Worker 驱动资源管线 + */ +declare var CC_WORKER_ASSET_PIPELINE: boolean; + +/** + * 是否启用 Worker 驱动音频系统 + */ +declare var CC_WORKER_AUDIO_SYSTEM: boolean; + +/** + * Worker 音频系统同步音频属性的间隔时间(单位:毫秒) + */ +declare var CC_WORKER_AUDIO_SYSTEM_SYNC_INTERVAL: number; + +/** + * 是否启用自定义 Worker + */ +declare var CC_CUSTOM_WORKER: boolean; + +/** + * 是否启用 Worker 调试模式 + */ +declare var CC_WORKER_DEBUG: boolean; + +/** + * 是否启用 Worker 使用同步版本的文件系统 API + */ +declare var CC_WORKER_FS_SYNC: boolean; + +/** + * 是否启用 Worker 子包 + */ +declare var CC_WORKER_SUB_PACKAGE: boolean; + +/** + * 是否启用 Worker + */ +declare var CC_USE_WORKER: boolean;