CC1.9.1微信小游戏环境下,预设挂载AudioSource出现报错

  • Creator 版本:1.9.1

  • 目标平台:微信小游戏

  • 详细报错信息,包含调用堆栈:

gameThirdScriptError
Cannot read property 'destroy' of null
TypeError: Cannot read property 'destroy' of null
    at Audio.23.proto.destroy (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:5530:22)
    at CCClass.onDestroy (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:13911:20)
    at CCClass.destroyComp (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:26759:67)
    at CCClass._onPreDestroy (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:14541:36)
    at CCClass.147.prototype._destroyImmediate (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:28641:34)
    at CCClass._onPreDestroy (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:35850:21)
    at CCClass._onPreDestroy (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:9996:36)
    at CCClass.147.prototype._destroyImmediate (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:28641:34)
    at Function.deferredDestroy (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:28552:42)
    at TheClass.mainLoop (http://127.0.0.1:64194/game/cocos2d-js.0c456.js:8472:23)
  • 重现方式:在预设中挂载AudioSource即可

  • 之前哪个版本是正常的 :1.9.0

  • 出现概率:100%

  • 额外线索:估计是跟这段代码有关

//CCAudio.js
    proto.destroy = function () {
        if (CC_WECHATGAME) {
            this._element.destroy();
        }
    };

1.9.1中,如果prefab挂载了AudioSource,在这个prefab释放的时候,微信小游戏环境下会不断报错,导致游戏卡死。另外,如果AudioSource是PlayOnLoad的话,就没这个问题。

@jare @panda 麻烦查看下,感谢。

1.9.1 有一个差不多的报错,我这个是loadscene时候会出现。

VM4533:1 gameThirdScriptError
Cannot read property 'destroy' of null;at setTimeout callback function
TypeError: Cannot read property 'destroy' of null
    at Audio.23.proto.destroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:5530:22)
    at CCClass.onDestroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:12654:20)
    at CCClass.destroyComp (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:21340:67)
    at CCClass._onPreDestroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:13284:36)
    at CCClass.133.prototype._destroyImmediate (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:23222:34)
    at CCClass._onPreDestroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:30431:21)
    at CCClass._onPreDestroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:8538:36)
    at CCClass.133.prototype._destroyImmediate (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:23222:34)
    at CCClass._onPreDestroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:30428:70)
    at CCClass._onPreDestroy (http://127.0.0.1:63212/game/cocos2d-js.f3e6f.js:8538:36)

发现这类问题都是小程序里的,确实是因为音频导致的。

这个是完整的调用链

	23.proto.destroy	@	CCAudio.js:180
onDestroy	@	cocos2d-js.f3e6f.js (old):12654
destroyComp	@	cocos2d-js.f3e6f.js (old):21340
_onPreDestroy	@	cocos2d-js.f3e6f.js (old):13284
133.prototype._destroyImmediate	@	cocos2d-js.f3e6f.js (old):23222
_onPreDestroy	@	cocos2d-js.f3e6f.js (old):30431
_onPreDestroy	@	cocos2d-js.f3e6f.js (old):8538
133.prototype._destroyImmediate	@	cocos2d-js.f3e6f.js (old):23222
_onPreDestroy	@	cocos2d-js.f3e6f.js (old):30428
_onPreDestroy	@	cocos2d-js.f3e6f.js (old):8538
133.prototype._destroyImmediate	@	cocos2d-js.f3e6f.js (old):23222
deferredDestroy	@	cocos2d-js.f3e6f.js (old):23133
runSceneImmediate	@	cocos2d-js.f3e6f.js (old):6731
(anonymous)	@	CCDirector.js:832
(anonymous)	@	CCAssetLibrary.js:110
(anonymous)	@	CCLoader.js:255
(anonymous)	@	utils.js:85
(anonymous)	@	WAGame.js:3
(anonymous)	@	WAGame.js:13
ontimeout	@	timers.js:469
tryOnTimeout	@	timers.js:304
listOnTimeout	@	timers.js:264

后来试了一下,应该只会在微信开发者工具里会出现这样的问题。真机上是正常的。

谢谢,已修复 https://github.com/cocos-creator/engine/pull/2596/files

我目前也遇到了了这个问题,请问在新版本出来之前怎么解决的,大兄弟?

题,请问在新版本出来之前怎么解决的,大兄弟?
我所有的组件,资源都是代码获取,还是有这个问题

可以定制下引擎…… 参考 http://docs.cocos.com/creator/manual/zh/advanced-topics/engine-customization.html#定制-javascript-引擎

必须定制引擎才能解决吗