Loading [MathJax]/jax/input/TeX/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战项目:飞机大战
运行程序,英雄飞机出现在屏幕底边的中央区域,飞机中央每隔一秒会自动发射一枚子弹。随着游戏的开始,敌机会在屏幕上方随机不定时的出现在屏幕内向下飞行。英雄飞机需要通过移位躲避敌机或用子弹消灭敌机,避免碰撞导致游戏结束。
佛系编程人
2020/02/25
1.9K0
类实例:飞机大战
一、子弹模块 import pygame WINDOW_WIDTH = 512 # 根据实际需求调整窗口大小 WINDOW_HEIGHT = 768 class Bullet(object): def __init__(self): # 图片,矩形对象,速度 self.bullet_img = pygame.image.load('res/bullet_11.png') # 资源文件自己选择 self.en
汪凡
2018/05/29
7200
基于Python的飞机大战复现
本游戏是一款使用Python和Pygame库开发的飞机大战游戏。玩家操控飞机,通过发射子弹击落敌机来获取分数,同时需要躲避敌机的碰撞。游戏具有开始界面、游戏界面和结束界面,还包括计分、生命值管理、敌机生成等功能。原文链接
Srlua
2024/11/27
1040
基于Python的飞机大战复现
CreatorPrimer|飞机大战(三)
《飞机大战(一)》介绍摄像机实现地图的滚动和子弹组件的设计;在此基础上《飞机大战(二)》增加了子弹的角度直线发射以及动态角度更新能力,用于实现如:散弹、螺旋扫射等华丽的子弹表现。
张晓衡
2019/09/11
1.1K0
CreatorPrimer|飞机大战(三)
【C++】飞机大战项目记录
根据飞机大战的游戏特性,首先可以确定的是游戏的基本玩法和规则。对于本软件项目,游戏的核心机制是使用鼠标控制一架飞机在屏幕上移动,同时飞机会自动发射子弹来击败敌机。我们将通过Easyx来实现该项目!
叫我龙翔
2024/04/21
3380
【C++】飞机大战项目记录
童年游戏大回顾:飞机大战
记得小学时,每逢放学便会打开电视机,接上红白机/小霸王,插上一张游戏卡带,魂斗罗、超级玛丽、冒险岛、足球小将
不惑
2024/02/27
4824
童年游戏大回顾:飞机大战
SpriteKit动画小游戏
Spritekit简介 Spritekit是苹果IOS7中引入的一个2D游戏引擎框架,可以实现各种动画效果,在这之前业界比较优秀的游戏引擎是cocos2d,支持场景切换、精灵和精灵表单、动作、动画和特
MelonTeam
2018/01/04
5.1K1
SpriteKit动画小游戏
Java打飞机小游戏(附完整源码)
技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。
Java团长
2018/08/06
7.2K2
500行代码,教你用python写个微信飞机大战
这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。
猴哥yuri
2019/10/21
1.3K0
500行代码,教你用python写个微信飞机大战
1小时1篇文学会python再做个飞机大战游戏
想慢慢学习的同学可以看我的 《python 入门到游戏实战专栏》(更新中) 想学 C 的同学可以看《大话系列之C语言》(基本更新完) 想学 C++ 的同学可以看《大话C++》(更新中) 想做习题的可以看《大学生C语言作业、习题100例白话详解》
1_bit
2022/01/06
9500
1小时1篇文学会python再做个飞机大战游戏
python实现微信小游戏“飞机大战”
以前版本的微信小游戏有一个飞机大战的游戏,学完python之后我试着写了下程序去基本实现这个游戏的部分功能,下面是小游戏飞机大战的python代码
墨明棋妙27
2022/08/24
1.3K0
python实现微信小游戏“飞机大战”
飞机大战(JavaScript)
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>打飞机</title> <style> #gamePanel{width:900px;height:500px;background:Black;position:absolute;left:100px;top:100px;} #gamePanel .score{font-size:12px;color:White;position:absolute;left:0;top:0;z-index:9999;} #gamePanel .bullet{width:5px;height:15px;position:absolute;background:url(img/bullet.png);overflow:hidden; _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/bullet.png");}   #gamePanel .flyer{width:48px;height:54px;position:absolute;background:url(img/flyer1.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/flyer1.png");} #gamePanel .enemy1{width:29px;height:32px;position:absolute;background:url(img/enemy1.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/enemy1.png");} #gamePanel .enemy2{width:26px;height:26px;position:absolute;background:url(img/enemy2.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/enemy2.png");} #gamePanel .enemy3{width:48px;height:48px;position:absolute;background:url(img/enemy3.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/enemy3.png");} #gamePanel .enemy4{width:48px;height:48px;position:absolute;background:url(img/enemy4.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/enemy4.png");} #gamePanel .bingo{width:18px;height:18px;position:absolute;background:url(img/bingo.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/bingo.png");} #gamePanel .change{width:40px;height:40px;position:absolute;background:url(img/change.png); _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="img/change.png");} #startBtn{border-width:20px;border-style:solid;border-color:Black Black Black Green;  po
林老师带你学编程
2022/11/30
4440
Python 游戏编程之实现飞机大战(含源代码)
第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每次都会下意识彼此较量一下,看谁打得更好。打飞机也是需要有一定的技巧的,熟练的朋友一把能打上半个小时,生疏的则三五分钟就败下阵来。
吾非同
2020/11/23
21.4K0
Python 游戏编程之实现飞机大战(含源代码)
微信小程序 案例二 飞机大战
提供了一个通过JavaScript 和 HTML的canvas元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。
万少
2025/02/08
970
微信小程序 案例二 飞机大战
10分钟教你用Python做个打飞机小游戏超详细教程
这次还是用python的pygame库来做的游戏。关于这个库的内容,读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上,自己也做了一点代码简化。尽量把最核心的方面用最简单的方式呈现给大家,让大家尽快掌握这个游戏的框架。至于那些华丽的功能,大家在弄懂了核心知识以后,再去添加也是非常easy的。
短短的路走走停停
2019/05/14
2.9K0
C语言飞机游戏
[设计难度 : ★☆☆☆☆ [参考书籍:《C语言课程设计与游戏开发实践教程》 [主要涉及知识:函数封装 + 循环判断语句 [程序运行效果图:
全栈程序员站长
2022/08/26
5K0
C语言飞机游戏
CreatorPrimer|飞机大战(一)
前两天在Cocos官方公众号上学习了「大掌教」的Cocos Creator 2.x Camera教程,总算是对摄像机组件有了一个初步的认识,乘热打铁Shawn用Camera摄像机练习了一个飞机大战游戏,目前主要实现3个功能:
张晓衡
2019/09/11
1.3K0
CreatorPrimer|飞机大战(一)
十、Python练习----基础搭建飞机大战
只是简单的学习了pygame,实现飞机的摧毁还需要多张图片的切换,和sprite(碰撞精灵),还有多种音效的添加(如背景音乐、摧毁特效)。以后再深入学习我只是练习一下python。 一、搭建界面(基于pygame的) #coding=utf-8 import pygame ''' 1. 搭建界面,主要完成窗口和背景图的显示 ''' if __name__ == "__main__": #1. 创建一个窗口,用来显示内容 screen = pygame.display.set_m
酱紫安
2018/04/16
1.6K0
C语言课程设计 — 飞机大战
这个游戏的功能很单一,也就是“飞机大战”,哈哈哈哈。总共只有300多行代码左右,你也可以想想它会有多简陋,把它复制下来编译一下可以直接执行,需要的同学可以自取~
Gorit
2021/12/09
1.1K0
飞机大战小游戏
一、飞机大战代码 1、今天我来分享一个飞机大战的代码,代码是用html+css+js写成的,还有一个img的文件夹,也就是放照片的,image文件夹链接放在下面。废话不多说代码在下面,大家自行观看!!! 2、 由于各种原因我们无法将image文件夹放在博文上,非常的抱歉!你们可以加我微信进群拿照片,我的微信号: y27724611159,大加加完好友之后我就把照片发个你们!!!真的不好意思 3、注意:请把放照片的文件夹务必命名为image !!!有兴趣的小伙伴们可以去http://haiyong.site
海曈
2022/11/14
4610
相关推荐
实战项目:飞机大战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验