前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >针对 iOS 14 Web 端性能问题的解决方案

针对 iOS 14 Web 端性能问题的解决方案

作者头像
一枚小工
发布于 2020-10-30 06:38:28
发布于 2020-10-30 06:38:28
98200
代码可运行
举报
文章被收录于专栏:Cocos Creator开发Cocos Creator开发
运行总次数:0
代码可运行

在今天这个快乐周五的早上,我们一到公司就收到了一些 CP 的紧急反馈,在 iOS 14 上,H5 游戏的性能下降,线上项目受到严重影响。

经过验证,此问题波及 iOS 14 上的所有浏览器、WebView 运行环境,小游戏和原生游戏不受影响。引擎组立即着手调试,经过一天的排查,发现这个问题的症结在 vb 和 ib 的共享上。

为优化性能,Creator 多个 drawcall 之间会共享同一份 vb 和 ib,每个 drawcall 使用一个偏移值在共享 vb 和 ib 中找到本次渲染的数据,但是经过我们验证后发现,共享 vb 和 ib 会导致在 iOS 14 上性能下降非常严重。

所以修复此问题的关键就是,在提交 drawcall 之后,切换 vb 和 ib。经过修改,问题就能得到完全解决。

解决方案:

> 2.2 版本:

在项目脚本最外层加入如下代码,直接覆盖 cc.MeshBuffer 中的方法即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
    };
}

也可以自定义引擎,手动合并此PR:https://github.com/cocos-creator/engine/pull/7415 。

2.1.x 版本

原理和 2.2 一样,首先在项目脚本最外层加入如下代码,直接覆盖 cc.MeshBuffer 中的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
        }
    };    
}

但 2.1 中没有实现 forwardIndiceStartToOffset,所以你还需要自定义引擎并找到 model-batcher.js,将 _flush 方法中的最后三行改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const isIOS14Device = cc.sys.os === cc.sys.OS_IOS && cc.sys.isBrowser && cc.sys.isMobile && /iPhone OS 14/.test(window.navigator.userAgent);

_flush () {
    let material = this.material,
        buffer = this._buffer,
        indiceStart = buffer.indiceStart,
        indiceOffset = buffer.indiceOffset,
        indiceCount = indiceOffset - indiceStart;
    if (!this.walking || !material || indiceCount <= 0) {
        return;
    }

    let effect = material.effect;
    if (!effect) return;

    // Generate ia
    let ia = this._iaPool.add();
    ia._vertexBuffer = buffer._vb;
    ia._indexBuffer = buffer._ib;
    ia._start = indiceStart;
    ia._count = indiceCount;

    // Generate model
    let model = this._modelPool.add();
    this._batchedModels.push(model);
    model.sortKey = this._sortKey++;
    model._cullingMask = this.cullingMask;
    model.setNode(this.node);
    model.setEffect(effect, this.customProperties);
    model.setInputAssembler(ia);
      
    this._renderScene.addModel(model);

    if (isIOS14Device) {
        buffer.uploadData();
        buffer.switchBuffer();
    }
    else {
        buffer.byteStart = buffer.byteOffset;
        buffer.indiceStart = buffer.indiceOffset;
        buffer.vertexStart = buffer.vertexOffset;
    }
},

2.0.x 版本

自定义引擎,并用此文件 https://forum.cocos.org/uploads/default/original/3X/2/6/2699adeb70a987f69ea2d72a5c5c953279c235dd.zip 覆盖引擎中的 mesh-buffer.js,然后再使用和 2.1.x 版本相同的改动方式修改。

注意:自定义引擎后需要重新编译引擎才能生效。建议合并后,使用不同手机进行全面测试。

诚挚道歉

对于本次意外给各位开发者朋友带来的困扰,我们感到非常抱歉。

性能是 Cocos 永远不变的追求,我们会持续关注这个问题,做好后续预案。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一枚小工 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Cocos Creator 2.2 的渲染流程(原生渲染)
Cocos Creator 升级的2.2之后,渲染流程发生了比较大的变化,主要是重构了一些类,属性的位置发生了变化。为了防止日后忘记,先记录下来。
我不是码神
2022/07/28
1.5K0
手机端页面在项目中遇到的一些问题及解决办法
首先你可能会给页面的 html 和 body 增加了 height: 100%, 然后就可能造成 IOS 上页面滑动的卡顿问题。解决方案是:
前端教程
2018/07/27
3.5K0
手机端页面在项目中遇到的一些问题及解决办法
关于cocos2dx客户端程序的自动更新解决方案
转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog)
帘卷西风
2018/08/03
1.1K0
【Unity面试篇】Unity 面试题总结甄选 |Unity性能优化 | ❤️持续更新❤️
Unity中,CPU准备好需要绘制的元素,对底层图形程序接口进行调用的过程,每次引擎准备数据并通知GPU的过程称为一次Draw Call。DrawCall越高对显卡的消耗就越大。 降低DrawCall的方法:
呆呆敲代码的小Y
2023/07/24
2.2K0
【Unity面试篇】Unity 面试题总结甄选 |Unity性能优化 | ❤️持续更新❤️
2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】
本文将整理的面试题大致分为以下几个模块,方便针对性学习和背题! 由于大部分常用的面试题在网上基本上已经有比较标准的答案了,所以说面试题类的文章基本上大同小异。 所以本篇文章中的部分内容也是直接从网上摘选来的 如果有不对的地方也欢迎指正(尽力不会出现这种情况),某个模块的内容不够也欢迎在评论区指出,我去重新添加上。
呆呆敲代码的小Y
2022/03/13
24.1K0
2022年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】
Linux 性能调优之硬件资源监控
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2023/11/28
6620
Linux 性能调优之硬件资源监控
基于 Vue 和 TS 的 Web 移动端项目实战心得
来源:https://juejin.im/post/5d759f706fb9a06afa32adec
ConardLi
2019/10/28
3.5K0
基于 Vue 和 TS 的 Web 移动端项目实战心得
深入剖析 iOS 编译 Clang / LLVM
2000年,伊利诺伊大学厄巴纳-香槟分校(University of Illinois at Urbana-Champaign 简称UIUC)这所享有世界声望的一流公立研究型大学的 Chris Lattner(他的 twitter @clattner_llvm ) 开发了一个叫作 Low Level Virtual Machine 的编译器开发工具套件,后来涉及范围越来越大,可以用于常规编译器,JIT编译器,汇编器,调试器,静态分析工具等一系列跟编程语言相关的工作,于是就把简称 LLVM 这个简称作为了正式的名字。Chris Lattner 后来又开发了 Clang,使得 LLVM 直接挑战 GCC 的地位。2012年,LLVM 获得美国计算机学会 ACM 的软件系统大奖,和 UNIX,WWW,TCP/IP,Tex,JAVA 等齐名。
用户7451029
2020/06/16
8K0
深入剖析 iOS 编译 Clang / LLVM
大数据技术之_18_大数据离线平台_02_Nginx+Mysql+数据收集+Web 工程 JS/JAVA SDK 讲解+Flume 故障后-如何手动上传 Nginx 日志文件至 HDFS 上
尖叫提示1:如果出现如下错误,请下载对应依赖包 ./configure: error: C compiler cc is not found ./configure: error: the HTTP rewrite module requires the PCRE library 解决方案:yum install gcc 和 yum install pcre-devel
黑泽君
2019/04/22
1.3K1
大数据技术之_18_大数据离线平台_02_Nginx+Mysql+数据收集+Web 工程 JS/JAVA SDK 讲解+Flume 故障后-如何手动上传 Nginx 日志文件至 HDFS 上
手把手教你配置linux下C++开发工具——vim+ycm(YouCompleteMe),支持基于语义的自动补全和第三方库补全(史上最简单、史上最透彻、史上最全的终极解决方案)
截止到目前,vim稳定版本已经到了8.2+,ycm(YouCompleteMe的简称)最新版本与几年前的安装配置截然不同了。之前网上很多教程也教不得法,生搬硬套,没有讲透彻。所以,才下定决心写一篇自认为史上最简单、史上最全的教程出来。
Java架构师历程
2020/11/10
6K0
手把手教你配置linux下C++开发工具——vim+ycm(YouCompleteMe),支持基于语义的自动补全和第三方库补全(史上最简单、史上最透彻、史上最全的终极解决方案)
基于Paddle Serving&百度智能边缘BIE的边缘AI解决方案
Paddle Serving作为飞桨(PaddlePaddle)开源的服务化部署服务化方案,提供了C++ Serving和Python Pipeline两套框架,旨在帮助深度学习开发者和企业提供高性能、灵活易用的工业级在线推理服务,助力人工智能落地应用。在最新的Paddle Serving v0.7.0中,提供了丰富的模型示例,总计有42个,具体模型信息可查看Model_Zoo:
用户1386409
2022/01/17
2620
基于Paddle Serving&百度智能边缘BIE的边缘AI解决方案
TensorFlow 1.x 深度学习秘籍:6~10
在本章中,我们将讨论循环神经网络(RNN)如何在保持顺序顺序重要的领域中用于深度学习。 我们的注意力将主要集中在文本分析和自然语言处理(NLP)上,但我们还将看到用于预测比特币价值的序列示例。
ApacheCN_飞龙
2023/04/23
9500
TensorFlow 1.x 深度学习秘籍:6~10
CMake脚本中如何修改XCode工程属性?
以下的所有属性列表(https://help.apple.com/xcode/mac/current/#/itcaec37c2a6): Active Build Action (ACTION)
24K纯开源
2020/09/01
5.4K0
最全面、最详细web前端面试题及答案总结
本章是HTML考点的⾮重难点,因此我们采⽤简略回答的⽅式进⾏撰写,所以不会有太多详细的解释。我们约定,每个问题后我们标记『✨ 』的为⾼频⾯试题 doctype的作⽤是什么?✨ DOCTYPE是html5标准⽹⻚声明,且必须声明在HTML⽂档的第⼀⾏。来告知浏览器的解析器⽤什么⽂档标准解析这个 ⽂档,不同的渲染模式会影响到浏览器对于 CSS 代码甚⾄ JavaScript 脚本的解析 ⽂档解析类型有: BackCompat:怪异模式,浏览器使⽤⾃⼰的怪异模式解析渲染⻚⾯。(如果没有声明DOCTYPE,默认就是这个模式) CSS1Compat:标准模式,浏览器使⽤W3C的标准解析渲染⻚⾯。 IE8还有⼀种介乎于上述两者之间的近乎标准的模式,但是基本淘汰了。
全栈程序员站长
2022/08/01
8.2K0
推荐阅读
相关推荐
Cocos Creator 2.2 的渲染流程(原生渲染)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文