Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【3.x合批亲测】使用这个优化方案,iPhone6也能飞起来,直接拉满60帧!

【3.x合批亲测】使用这个优化方案,iPhone6也能飞起来,直接拉满60帧!

作者头像
张晓衡
发布于 2023-02-23 05:38:01
发布于 2023-02-23 05:38:01
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是晓衡!

上周我花了3天的时间,体验测试了一款 Creator 3.x 性能优化工具:98K动态分层合批!

它能将 DrawCall 超过 1000+ 次的 2D 界面,实现运行时节点分层排序,利用引擎动态合图 + 批量渲染能力,从底层将 DrawCall 优化到个数位。

测试案例是一个 2D 背包界面,我在 ScrollView 中动态创建了 500 个 item 元素。你可以看到,在 Chrome 浏览器上,开启合批优化后 DrawCall 从 1016 直接降到了 8,游戏帧率也从 5 帧直接拉满到 60 帧。

这里是H5测试体验链接,你也可以试一下:

  • http://gameview.creator-star.cn/98K/batch-items/index.html

98K动态分层合批 支持H5、小游戏、原生等多个平台。而我的测试目标是,观察对比在不同平台环境上,使用 98K 优化前后的性能表现差异。

01 合批优化测试

先给出我的测试结果,一共测试了 7 个环境:

  1. Mac M1 Chrome 桌面浏览器
  1. realme X50 Pro Android 原生
  1. realme X50 Pro Android 微信小游戏
  1. OPPO R11s Plus Android 原生
  1. OPPO R11s Plus Android 微信小游戏
  1. iPhone11 微信小游戏
  1. iPhone7 微信浏览器

以上测试环境数据,我整理了个表格,方便大家对比优化后的效果:

如果你觉得看数据表还是很费劲的话,可以直接看晓衡这个结论:

  1. 开启合批优化后,所有平台都能跑到 60 帧,ScrollView列表滑动流畅
  2. 除减少 DrawCall 外,还开启了渲染剔除算法以降低渲染面数
  3. 优化前后差异对比是:桌面 > 低端原生 > 低端小游戏 > 中高端原生&小游戏

桌面浏览器上的优化性能最佳,这是我万万没想到的,不论是 Mac 还是 Windows 系统,都是如此。未合批前仅仅只有 5 帧,在列表上滑动,非常卡顿,基本上无法使用。开启合批后,直接拉满到60帧,列表滑动流畅。

其次是在 iPhone 上,小游戏上的优化比浏览器要好,未合批前不到 30 帧,开启合批后满帧 60,列表滑动也更顺滑。

然后是在 Android 手机上,中高机型未合批前就能达到 50 ~ 60 帧,优化后提升不到 10 帧的样子,不看调试数值感觉不明显。低端机型的优化效果不错,有 20 ~ 30 帧的提升,硬件性能越低优化后的效果越好。

最后,我发现在 iPhone 和 Android 低配机型上,在未优化时原生性能要低于H5和小游戏,DrawCall 优化后效果立马就出来了。

下面是我构建的 APK 安装包,感兴趣的伙伴可以来体验一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
链接: https://pan.baidu.com/s/12aEvOL9fQrpyB4Xs--OALg?pwd=4znt 提取码: 4znt

测试数据和结论有了,我们再深入一点!98K动态分层合批的核心是对 DrawCall 的优化,初学游戏开发的小伙伴,可能会有疑问:

DrawCall 是什么?为什么减少 DrawCall 能提升游戏的性能?合批又是个什么鬼?

而有过游戏开发经验,又爱思考的老铁多半会问:

道具背包这类应用场景,一个 item 混合有复杂的图片、文字,98K是如何避免 DrawCall 被打断的呢?

下面晓衡就来尝试一下,能否将以上几个问题给说清楚。这可以让你更加清晰地知道,是否适合在自己的项目中使用98K合批做优化。

02 理解Drawcall与合批

DrawCall 是什么?
  • 简单来讲 CPU 准备好渲染数据,提交给 GPU 进行绘制的这个过程就是一次 DrawCall
为什么减少 DrawCall 能提升游戏的性能?
  • GPU 渲染图像的速度非常非常快
  • CPU 的内存\显存读写、数据处理和渲染状态切换,相比 GPU 非常非常慢
  • 大量的 DrawCall 会让 CPU 忙到焦头烂额,而 GPU 大部分时间都在摸鱼

因此,尽可能一次性将更多的渲染数据提交给 GPU,减少 CPU 的工作时间,从而提升游戏性能。

什么是合批?
  • 简单来说,组织更多渲染数据提交给 GPU 的过程,称之为“批量渲染”简称“合批”
  • 但要实现合批的前提是:渲染数据必须一致

更多关于 DrawCall 优化的理解,可以阅读陈皮皮的这篇文章:Cocos Creator 性能优化:DrawCall

举个例子

比如像下面这样的节点树结构,就无法实现合批:

因为 item 节点下的 Sprite 与 Label 节点渲染类型不同,并相互间隔排列,引擎无法向 GPU 批量提交渲染数据。

因此渲染一个 item 需要 DrawCall 4次:Sprite → Label → Sprite → Label。

我们调整一下 item 下的节点顺序,像下面这样:

试试你能计算出上图中的 DrawCall 值吗?在 Creator 引擎中预览运行游戏,在画面左下角,你会看到 DrawCall 的值显示为 3。

细心的你这时可能会问:为什么 DrawCall 是 3 而不是 2 呢?

不用怀疑,你计算的 DrawCall 为 2 是正确的,因为引擎这里会占用一次 DrawCcall,具体为什么,我们后面来说原因,你也可以先思考一下!

03 98K是如何避免 DrawCall 被打断?

要想避免 DrawCall 被打断,首先要理解什么是 DrawCall 打断!

通过上面的举例,不知道你没有点感觉了。我们再来看多个 item 节点树 DrawCall 情况又会是怎么样的呢?

在层级管理器中,我们再复制一颗 item 节点树出来,见下图所示:

从上图可以看出,两颗 item 节点树时又出现:item1(Sprite → Label) → item2(Sprite → Label) 交替的情况,合批就这样被打断了。

聪明的我立马会想到,将所有 item 下的节点合并不就好了,像下图这样:

效果是不是很好?6 个节点只有 2 次 DrawCall !就这样干?

有经验的你问题又来了,我们的逻辑代码通常是以单个 item 为单位建立的对象,如果将类型节点点合并到一起,上层逻辑代码岂不是要乱成一锅粥?

优化的方法是知道了,但代价太大,不知道如何下手!

这个问题一直困扰我多年,一直没找到可行的解决方案,直到遇到98K动态合批的开发者。

这里不得不说下 98K动态合批 的强悍,就在于它可以让你无视 item 子节点顺序和层级关系,只需要在上层容器节点上添加 BatchItems 组件,最大程度上保证合批不被中断,实现该节点树的渲染优化。

其代码实现原理是:

  1. 拦截引擎渲染开始事件,对节点树下的所有子节点按类型重新分层排序;
  2. 拦截引擎渲染结束事件,立即还原渲染前的节点树排序,从而实现无入侵式的合批优化
  3. BatchItem组件唯一的 Culling 属性是可选的,它会拿 Culling 属性所指定的矩形区,与容器中 item 矩形做相交测试,将不在 Culling 区的元素从渲染队列中剔除掉

如果你对性能优化代码和技术感兴趣,可以加入作者的微信群(见文末二维码)。

04 应用场景

需要注意的是98K合批优化,仅适用于 2D UI 界面的优化,特别是具有大量重复结构的 item 场景如:背包系统、滑动列表、技能栏、聊天界面等,以下应用场景供大家参考。

背包系统
频道列表
游戏排行榜
聊天界面

05 注意事项

我在使用 98K 编写前面那个背包测试工程时,踩到几个坑需要注意:

  • item 下的子节点名字不能重复需保持唯一性
  • 多个同结构的 item 子节点名字需要保持一致
  • 节点的 Layer 属性需保持相同,建议统一为 UI_2D
  • 充分使用引擎的动态合图,将尽量多的图片合并,需要增大项目设置中 BATCHER2D_MEM_INCREMENT 宏的参数值

需要手动开启引擎的动态合图和关闭清除图片缓存开关

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dynamicAtlasManager.enabled = true;
macro.CLEANUP_IMAGE_CACHE = false;

结语

最后,我再小结一下!

98K动态分层合批 是非常适用于像背包系统、滑动列表、聊天消息这类 2D UI 场景。

如果因游戏中因节点太多导致图文分层原因,打断合批造成 DrawCall 剧增影响性能和增加发热问题,98K合批可以说是首选的优化工具。

当然,你也可以使用虚拟列表的技术并不用创建出所有的 item,但我的感受是98K更为简单粗暴、立竿见影,能结合使用效果肯定会更佳。

而从运行环境平台的测试效果来看:

  1. 桌面浏览效果最佳,如果你是做 H5 页游,那再适合不过
  2. 再次是 iPhone 浏览器与小游戏优化效果显著
  3. 然后是中低端的 Android 也比较推荐

下面是 H5 | Android 测试链接,强烈建议你也来体验一下,欢迎留言说说在你的设备上体验感受。

H5测试链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://gameview.creator-star.cn/98K/batch-items/index.html

Android APK下载链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://pan.baidu.com/s/12aEvOL9fQrpyB4Xs--OALg?pwd=4znt 提取码: 4znt

Cocos Store下载链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://store.cocos.com/app/detail/4310

今天的分享就到这里,希望对你有所帮助和启发,晓衡会继续挖掘 Cocos Store 上的优秀作品分享给大家,欢迎关注!

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

本文分享自 Creator星球游戏开发社区 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
连“捉阔”是什么都不知道就不要混了!如何优化看这里!
在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现。
张晓衡
2020/07/09
2.4K0
连“捉阔”是什么都不知道就不要混了!如何优化看这里!
小游戏内存优化与性能优化
| 导语 听说你的小游戏内存超标?进来了解一下吧。 本文主要跟大家一起来探讨一下Cocos Creator小游戏开发过程中内存优化、性能优化和包体优化。 一、内存优化 因为 iOS小游戏和微信共用同一个进程,而微信在连续两次收到系统内存警告的时候会关闭小游戏并释放小游戏占用的内存。如果你的小游戏有外网用户反馈“闪退”,或者你自己测试的时候频繁出现“该小程序可能导致微信响应变慢被终止”等提示,那么就应该是时候优化你的小游戏内存了! 1、优化双份纹理(必做!) 在你的项目中添加如下代码,就可以减少大
腾讯NEXT学位
2018/09/12
9.3K1
小游戏内存优化与性能优化
基于 Cocos 的高性能跨平台开发方案
2018 年 6 月 GMTC 全球移动技术大会在北京举办,大会旨在通过聚焦前沿技术与实践经验帮助参会者了解移动开发、前端领域最新的技术趋势与最佳实践。
HaHack
2018/08/02
3.2K0
基于 Cocos 的高性能跨平台开发方案
微信小游戏性能优化
| 导语【整合cocos博客、微信小游戏及laya性能优化官方文档总结并实践】业务中实践cocos导出的微信小游戏性能优化案例,希望对大家有所帮助~
EchoROne
2022/12/29
3.4K0
微信小游戏性能优化
Cocos 小白的性能优化探索
近期使用了 cocos creator 来开发一些游戏化的课中互动。Cocos 是一个优秀的国产游戏引擎,可以通过 Javascript 写出跨平台的游戏。看完文档,吭哧吭哧搞完,看似完美运行,然而体验会上,大家却提出加载时黑屏时间长、手机发烫严重、闪退、卡顿等问题。头疼,只能想办法优化。 经过几天的优化,性能才渐渐达标,其间踩了不少坑,所以打算将一些性能问题排查和优化的手段记录起来,分享给有需要的同学。 虽然 Cocos 属于游戏开发范畴,但与前端开发中遇到的性能问题还是有很多共通之处,无非是加载速度、C
用户1097444
2022/06/29
3.2K0
Cocos 小白的性能优化探索
4个方面入手 TiledMap 地图优化!W字干货分享
引言:如何进行 TiledMap 地图优化?开发者 Bool Chen 将分享一套行之有效的 TiledMap 地图优化方案,其中包括了渲染、解析、寻路方面。
张晓衡
2023/02/23
3.1K0
4个方面入手 TiledMap 地图优化!W字干货分享
社区10款年度优秀插件框架盘点!
以下游戏资源排名不分先后,Cocos Store 年终元旦限时优惠进行中......
张晓衡
2023/02/23
1K0
社区10款年度优秀插件框架盘点!
开工大吉 | Cocos Store 精品资源推荐
同时,今天为大家推荐的是 Cocos Store 2022年度口碑与销量俱佳的插件工具和游戏源码共计20款,相信这其中一定有你能用得上的宝藏资源,助你开工大吉!
张晓衡
2023/02/23
1.5K0
开工大吉 | Cocos Store 精品资源推荐
游戏性能优化
异名最近负责了一个微信小游戏的项目,在版本迭代间隙对游戏的性能调优进行了一次尝试。这个游戏是个打击类游戏,下面展示一下游戏的预览效果? 性能指标 引擎和小游戏都有提供一个性能面板,给开发者们暴露了下面
异名
2020/07/03
2.1K0
研究一下物理引擎,做了个游戏,文末有感
前阵子过春节,在家看小孩没法出去玩,于是就码起来了,心血来潮想做个基于物理引擎的小游戏,于是愉快地打开了cocos creator(后面简称为ccc)。
花叔
2019/03/12
2K1
研究一下物理引擎,做了个游戏,文末有感
国产引擎 Cocos 的跨平台渲染器架构与实践 | GMTC
你好,我是 Cocos 引擎的创始人王哲。跟看到这篇文章的你一样,我也是一位程序员,虽然现在的主要工作更偏向于经营管理,但是程序员的底子已经刻到基因里了,所以在此想跟你分享一下 Cocos 引擎的技术架构与相关实践,希望能给你带来一些新的认识。
深度学习与Python
2022/03/22
1.6K0
国产引擎 Cocos 的跨平台渲染器架构与实践 | GMTC
硬核干货丨游戏大世界的超远视距处理手法,建议收藏!
| 导语   本文从浮点数精度、实时阴影、合批策略和剔除算法四方面阐述游戏大世界的超远视距处理的常用手法。 当世界足够大的时候,浮点数的精度问题就会呈现出来。浮点数的精度可能带来的问题可谓五花八门,如模型之间出现接缝和穿插、光照计算出现溢出变黑、骨骼动画出现抖动等。如果你在半精度Shader开发中没碰到过这类问题,那不是你的算法太优秀,就是你还没被现实所教育。 位置和计算精度问题 一般来说,在CPU端,游戏中的数学库大多是基于32位浮点数构建,常用的如向量运算、矩阵运算、开方求幂、三角函数、BVH划
腾讯大讲堂
2020/10/21
2.9K0
游戏渲染优化
Phaser 内部使用的是 Pixi v2 的一个自定义版本用于渲染。为了快速得渲染多个精灵,Pixi v2 支持在 WebGL 下进行批次渲染(sprite batch),工作流程如下:
零式的天空
2022/03/25
1.4K0
过亿月流水H5游戏优化分享、腾讯自研H5游戏优化分享、Layabox官方优化分享,全在这里了!
讲到优化,嘉宾们几乎都会提到优化与调试工具,掌握工具是性能优化的基础。那么都有哪些工具呢?常用的有三个:
Layabox Charley
2019/05/10
2.8K0
过亿月流水H5游戏优化分享、腾讯自研H5游戏优化分享、Layabox官方优化分享,全在这里了!
Cocos Creator 出新版本啦, 2.1.2 圆形Shader终于可以完美解决了!
自 Cocos Creator 2.1.0 发布以来,经过半年时间更新迭代,版本现已趋于稳定,目前 2.1 的新增用户已经占据主流。因此我们计划减少 2.0 版本的后续维护力度,将分散的精力集中投入到引擎后续的发展中,力争将 Cocos Creator 打造成更加专注、开放、健康的开源平台。
张晓衡
2019/09/25
3.3K0
Cocos Creator 出新版本啦, 2.1.2 圆形Shader终于可以完美解决了!
iOS 14 egret H5游戏卡顿问题分析和部分解决办法
现象 总体而言,iOS 14 渲染性能变差,可以从以下几个测试看出。 测试1: 简单demo,使用egret引擎显示3000个图(都是同一个100*100 png 纹理),逐帧做旋转。(博客园视频播放
用户1258909
2020/10/30
3.7K0
iOS 14 egret H5游戏卡顿问题分析和部分解决办法
实战PerfDog优化小游戏性能
背景: 我们的引擎是Egret,使用的是原生的EUI,转微信小游戏; 工程第一版出来后使用PerfDog测试一波数据。结果发现很多问题,本文主要分两部分
WeTest质量开放平台团队
2020/08/25
1.2K0
抖音国庆小游戏是如何实现的?
经过若干个月的点滴积累,我有幸参与到抖音国庆活动的开发,这是我第一次完整参与大型活动项目的开发,它是全员关注的一个重点项目,致力于让用户领略美好中国,指导用户在抖音中搜索与获取旅行攻略和出游信息。
ConardLi
2021/12/02
1.7K0
抖音国庆小游戏是如何实现的?
如何用UPA优化性能?先读懂这份报告!
原文链接:http://wetest.qq.com/lab/view/375.html
WeTest质量开放平台团队
2018/04/08
1.1K4
如何用UPA优化性能?先读懂这份报告!
如何用UPA优化性能?先读懂这份报告!
WeTest UPA是WeTest和Unity联合出品的一款Unity游戏性能优化的工具,自上线以来受到了很多Unity游戏开发人员和测试人员的关注,同时也有一些用户反馈不知道应该如何解读UPA报告,下面我们对UPA报告的解读方法进行总结,帮助大家最大化利用UPA报告,解决游戏性能问题。
WeTest质量开放平台团队
2018/10/29
6850
相关推荐
连“捉阔”是什么都不知道就不要混了!如何优化看这里!
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验