针对 iOS 14 Web 平台性能变差的优化方案

引擎版本2.3.0 采用

const isIOS14Device = cc.sys.os === cc.sys.OS_IOS && cc.sys.isBrowser && cc.sys.isMobile && /iPhone OS 14/.test(window.navigator.userAgent);
if (isIOS14Device) {
    cc.MeshBuffer.prototype.checkAndSwitchBuffer = function (vertexCount) {
        if (this.vertexOffset + vertexCount > 65535) {
            this.uploadData();
            this._batcher._flush();
        }
    };     
    cc.MeshBuffer.prototype.forwardIndiceStartToOffset = function () {
        this.uploadData();
        this.switchBuffer();
    }  
}

提示 undefined is not an object (evaluating cc.MeshBuffer.prototype)?

1赞

我们用的是2.0.9用文中的方式修改引擎。修改后帧率是提上高了。不过出现了新的问题,有些spine动画会渲染不出来。不知道还有没有其它方式可以修复掉帧的问题。

这段代码在哪儿写的?

查看了一下打印,spine动画不显示是因为报了这个错,console.error(‘Failed to update data, bytes exceed.’);

修改的是哪个文件夹下的文件?

有demo么?

mesh-buffer.js 的改动是在 destroy 方法中把 array 的迭代方式改成 for in, 这样做有什么特别的原因吗?

那段有改动么?主要是需要改这段:

呃不好意思,原来是我合并过更新版本的mesh-buffer。。。

修改后,帧率是上来了,但是出现了新的问题,部分图片显示是黑色的。

什么版本?

2.3.2

确定是这个改动引入的么?

到底要怎么改呢 我看着有点懵

刚复测了下,不改动web性能,同样有问题,在ios14上面显示异常 之前版本都是正常的。原生包的Label描边也出现异常,不是黑色的描边现在在ios14上显示黑色的描边,引擎版本也是2.3.2。

试过了两种,都不行,最后改成自定义引擎了
第一种:
(function(){

const isIOS14Device = cc.sys.os === cc.sys.OS_IOS && cc.sys.isBrowser && cc.sys.isMobile && /iPhone OS 14/.test(window.navigator.userAgent);
if (isIOS14Device) {
    cc.MeshBuffer.prototype.checkAndSwitchBuffer = function (vertexCount) {
        if (this.vertexOffset + vertexCount > 65535) {
            this.uploadData();
            this._batcher._flush();
        }
    };     
    cc.MeshBuffer.prototype.forwardIndiceStartToOffset = function () {
        this.uploadData();
        this.switchBuffer();
    }  
}

}());

一个单独的js文件放在 项目工程里

第二种:
在引擎代码加载成功后,在registerCCParam重写mesh-buffer两个方法也不行
var engineurl ="./…/…/common/cocos2d-js-min.230.cut.ios14hack.js";
loadScript(engineurl, function () {
registerCCParam();
window.boot();
});

我们这边测试ios 8p 手机 14系统,fps稳定在30, 这个需要引擎大佬帮忙解决下

感觉没设置成功吧? iOS 13 多少fps

ios13 60fps左右,同一份代码,其他ios手机 14系统都正常了

那 iOS 13 的 8p 手机呢?