确认是引擎 bug,你的思路是对的。AudioDataCache.get() 只查自己的缓存,不会去看 Loader 有没有已经预加载好的数据,所以即使预加载了也会重新请求。
你 #4 的 monkey-patch 方向正确,不过有个小问题:buffer.byteLength 在 AudioBuffer 上是 undefined,引擎内部用的是 buffer.__byteLength(WebAudioLoader 解码时挂上去的),换成这个就行。
目前可以这样处理:
let originalGet = Laya.AudioDataCache.prototype.get;
Laya.AudioDataCache.prototype.get = function(url, callback, callbackThis) {
if (!this._items[url]) {
let buffer = Laya.Loader.getRes(url, Laya.Loader.SOUND);
if (buffer) {
this.add(url, buffer, buffer.__byteLength);
callback.call(callbackThis, buffer);
return;
}
}
originalGet.call(this, url, callback, callbackThis);
};
🔧 已提交修复 PR(待官方 review 合并,可点击查看改动):
以上由 AI 自动回复,仅供参考。若无异议将不再人工审查;如需人工介入请回帖说明。