[LayaAir 1.0]一个修复Laya1.8.3中的粒子销毁时报错黑屏问题的思路

我们的产品使用1.8.3版本开发,在1.8.3中,粒子对象销毁时会黑屏,并有报错。
 
这个问题我之前反映过,不过没有回应。http://ask.layabox.com/question/44825
 
近日花了点时间,找到了一个解决问题的思路,并总结了一段代码,目前看下来可以使粒子系统正常运行和销毁,且不会对其余系统产生影响。各位同学如果遇到类似问题可以尝试照此思路解决。但不保证可靠。
 
参考:https://stackoverflow.com/questions/12427880/is-it-important-to-call-gldisablevertexattribarray
 
问题出在粒子系统的shader用到了很多顶点属性,一般的shader顶多用2~3个,粒子系统用到了10个,而这些属性在enableVertexAttribArray之后没有disableVertexAttribArray,导致粒子相关buffer被delete之后出现no buffer is bound to enabled attribute报错。
 
解决代码:
 
   let $beginFlush = Laya.RunDriver.beginFlush;
Laya.RunDriver.beginFlush = function () {
$beginFlush.call(this);
let attrs = Laya.Buffer._enableAtributes;
if (attrs) {
attrs.forEach((buffer, index) => {
if (buffer && buffer.deleted) {
Laya.WebGL.mainContext.disableVertexAttribArray(index);
attrs[index] = null;
}
});
while (attrs.length > 0 && attrs[attrs.length - 1] == null) attrs.pop();
}
};

let $bufferRecreateResource = Laya.Buffer.prototype['recreateResource'];
Laya.Buffer.prototype['recreateResource'] = function() {
$bufferRecreateResource.call(this);
if (this._glBuffer) {
this._glBuffer.deleted = false;
}
};

let $bufferDisposeResource = Laya.Buffer.prototype['disposeResource'];
Laya.Buffer.prototype['disposeResource'] = function() {
if (this._glBuffer) {
this._glBuffer.deleted = true;
}
$bufferDisposeResource.call(this);
}
 
以上~欢迎交流,敬请指正
已邀请:

devyding

赞同来自:

刚好遇到这个问题,感谢提供思路和解决方案
看论坛从08年就开始有人反馈这个问题,看来1.x版本不会修复了,2.x测试没有问题

要回复问题请先

商务合作
商务合作