热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

引擎组大神太牛了,10小时搞定iOS14Web端性能问题,请相互转告!

在今天这个快乐周五的早上,Cocos引擎组收到了一些CP的紧急反馈,在iOS14上,H5游戏的性能下降,线上项目受到严重影响

在今天这个快乐周五的早上,Cocos引擎组收到了一些 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 中的方法即可。

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 中的方法。

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 方法中的最后三行改为:

        const isIOS14Device &#61; cc.sys.os &#61;&#61;&#61; cc.sys.OS_IOS && cc.sys.isBrowser && cc.sys.isMobile && /iPhone OS 14/.test(window.navigator.userAgent);_flush () {let material &#61; this.material,buffer &#61; this._buffer,indiceStart &#61; buffer.indiceStart,indiceOffset &#61; buffer.indiceOffset,indiceCount &#61; indiceOffset - indiceStart;if (!this.walking || !material || indiceCount <&#61; 0) {return;}let effect &#61; material.effect;if (!effect) return;// Generate ialet ia &#61; this._iaPool.add();ia._vertexBuffer &#61; buffer._vb;ia._indexBuffer &#61; buffer._ib;ia._start &#61; indiceStart;ia._count &#61; indiceCount;// Generate modellet model &#61; this._modelPool.add();this._batchedModels.push(model);model.sortKey &#61; this._sortKey&#43;&#43;;model._cullingMask &#61; 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 &#61; buffer.byteOffset;buffer.indiceStart &#61; buffer.indiceOffset;buffer.vertexStart &#61; buffer.vertexOffset;}
},

            

2.0.x 版本

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

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

对于本次意外给各位开发者朋友带来的困扰&#xff0c;引擎组感到非常抱歉。

性能是 Cocos 永远不变的追求&#xff0c;引擎组大神们会持续关注这个问题&#xff0c;做好后续预案。如在解决过程中遇到困难&#xff0c;你可以点击【阅读原文】进入论坛与引擎组开发人员联系。

最后&#xff0c;非常感谢热心提供反馈的开发者们&#xff0c;也感谢大家的理解与支持&#xff0c;祝大家周末愉快&#xff01;



推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • fileuploadJS@sectionscripts{<scriptsrc~Contentjsfileuploadvendorjquery.ui.widget.js ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
author-avatar
灿烂的胖羊羊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有