热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

经验分享:《节奏大师》UI优化历程

节奏大师是一款国民级的音乐游戏,写这篇文章的时候刚好是节奏大师三周年生日,2020年7月20日节奏大师首次发布,就吸引了众多的玩家

节奏大师是一款国民级的音乐游戏,写这篇文章的时候刚好是节奏大师三周年生日,2020年7月20日节奏大师首次发布,就吸引了众多的玩家,时隔一年多,节奏大师作为第三个登陆微信平台的腾讯自研游戏,刚上线就积累了非常多的用户。随着用户数的不断剧增,再加上当初手机游戏开发不够成熟,一些问题隐患也在上线后慢慢的暴露出来了。

节奏大师是款国民级的音乐游戏,所以最早在客户端这一侧对它性能基线就设置的非常低,也就是要让游戏能够运行在各种设备上,不管是高端的还是低端的,需要保证在低端机上玩也不会出现过多的崩溃现象。

另外客户端这一侧还得保证游戏的核心体验(也就是打歌)必须流畅,最关键的节奏大师的核心玩法是绝对不能出现有帧频不稳定的现象,也就是所谓的“突然卡一下”,因为只要一卡,对玩家的这种极致体验会带来非常不爽的感觉。经过一些测试,如果游戏帧速到了50以下,就会影响到核心体验,它不像其他类型的游戏,比如SLG这种类型的,中间卡一下不会有什么大碍。

当初上线一段时间后,节奏大师出现了一个最严重的问题,就是内存,游戏启动以后常驻内存非常高,内存有问题,会带来各种隐患,比如会增加crash率,会影响到CPU的运行效率等等。经过开发的一系列排查,定位到一块地方,就是UI贴图资源占用过多。

节奏大师的UI贴图资源主要用在以下几个地方:
 


  • UI显示,也就是平时看到的按钮、面板等图片资源;
  • 打歌时候的Note资源,特效资源等;


根据测试,发现内存占用情况如下表:
 


这样看,还可能看不出什么问题,继续跟踪,发现在启动游戏后,进入主界面,发现内存就有100M左右,然后不停的切换界面,内存几乎保持不变,然后开始打歌游戏,内存会略有上涨,然后再退出打歌,发现内存却没有什么改变。

节奏大师的UI是环形结构的,也就是每个UI都是独占的,当从这个UI切换到另一个UI,之前那个界面其实就可以从内存中销毁的,而从上面的测试结果来看,貌似是没有销毁这一回事,一上来内存就偏大,界面切换内存也不会有啥变化。另外我们也找到了目前UI图集的组织关系,如下图所示:
 


从上面可以看出,每个UI引用了多张贴图,也就是UI跟贴图之间没有任何的对应关系,乱糟糟的没有规划可言。所以这个也印证了上面的内存现象。

目前这种UI组织架构会带来很严重问题:
 


  • 后续开发会有隐患,内存得不到控制,增加crash率,节奏大师是用户数非常多的项目,低端机有风险,对产品本身伤害很大
  • 引擎不成熟,没考虑图集释放,UI关闭的时候没有释放贴图的逻辑;
  • 工具端操作繁琐UI;
  • UI引用关系太复杂了,已经控制不下去了,以前都是美术随便照一张大图把小图放进去,手工切割sprite也非常不精确,有误差。


针对上面的问题,主要从以下几个方面来解决:
 


  • 重新整理所有的Atlas图集,每个UI只有单一的图集与之对应;
  • 整理出公共的Atlas图集;
  • 修改所有的UI文件,将里面的sprite重定向到最新的sprite;


具体的步骤如下:

1. 切割原始的大贴图,将它们拆分成每张小图,其实这些小图就是美术当时做出来的;
2. 扫描原始的UI文件,将每个UI用到的sprite,也就是小图,都收集到对应的文件夹下,也就是比如背包UI上用到的各张小图都归类到背包UI的文件夹下,这样就生成了多个目录,每个目录是对应的UI,目录下面都是下图;
3. 扫描用到的公共sprite小图,将被UI用到了N(这个数字要反复测试调整)次的小图收集起来,把他们定义成公共Atlas图集;
4. 将上面的各个UI目录,以及公共图集目录,重新打包成大图,生成最新的Atlas配置文件;
5. 将原始的UI文件(这里的UI文件指的是UI的配置文件)里使用到的sprite配置重定向到最新的Atlas配置下的sprite。

通过上面步骤,就把原先的贴图资源重新拆分合并,原先的UI配置重新统一修改,最终达到了这样的效果:
 


也就是首先每个Atlas配置只会对应一张贴图,每个UI只会使用自己的Atlas贴图以及公共贴图,所以理论上,在某个界面下,内存里的UI贴图资源最多只有两张1024*1024的图片,这样来看相对于之前,进入一个UI,要加载10来张贴图,这个方案是必须的也是必然的。

这上面都是用工具处理的,在项目代码里,也需要做一些处理,这里就不展开说了。通过上面的修改,主要达成了几个目的:
 


  • 优化了美术同学的工作流程,美术同学只需要给程序这里出好每个小图就可以,不需要再去人为的拼大图以及人工划分sprite,对,你没看错,以前的大图不是用工具来打包的,是自己拼的,sprite信息也是自己手工切割的,下图所示

里面的小矩形区域,是人为画的!!!!


  • 规范了程序开发的调用规范,每个UI的加载释放都通过断言去约束,确保发生一些不必要的错误;
  • 确保主玩法以外的独立场景,只有1-2张贴图资源,主玩法有6-7张贴图资源;


最后看下优化后的结果:
 


也许好多人看到这里会觉得这种方案应该目前在每个项目都是这么用的,目前是非常普遍的做法,贴图资源用工具打包啊,每个UI由固定的独立的贴图去对应啊,但是因为节奏大师项目起步非常早,在手游领域这块摸索了很久,而且当初因为工具引擎端的不成熟,然后再加上人为的一些不严谨,导致了到最后问题被放大,差点无法控制。二手QQ买卖这个优化工作前后做了三个礼拜左右,涉及到所有的UI文件、UI贴图,工作量还是非常大的,最后贴几张当时优化中的一些成果:

这是当初用工具扫描老UI的情况,是每个UI涉及到的贴图情况,还是相当吓人的。


这是当初写的工具,看起来有点乱。
 


这是当初从开始到结束每个流程上的邮件汇报。
 


推荐阅读
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
author-avatar
allenn2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有