手机发烫怎么办?消消乐游戏发热优化总结
作者:Marvinc
1、背景
项目组同学在体验斗棋牌消消乐玩法时,反馈iPhone7p玩半个小时,手机发烫,针对这个问题,程序和美术同学采取将静态UI渲染到纹理、降低帧率、简化小部分动画等方式进行了优化。
2、发热原因
游戏发热严重,主要受CPU或者GPU占用过高影响。分析之后发现,消消乐玩法CPU占用不高,而GPU占用却很高,GPU占用高基于如下几个原因:
消消乐玩法待机状态如下图所示:图中红色箭头指向场景中的静态纹理,并由里向外进行了编号,从图中可以看出,场景左侧区域包含两层静态纹理,中间区域包含三层静态纹理,右侧区域包含两层静态纹理。
Cocos2dx引擎在绘制场景代码如下图所示:图中代码说明,每次渲染时,首先对节点据zorder和加入场景树的前后顺序进行排序,从场景根节点开始递归遍历绘制,不会判断节点之间是否有遮挡关系,这意味着场景中,同一个区域有几层纹理,GPU就需要画几层。消消乐玩法,屏幕中被重复覆盖的面积是屏幕面积的两倍都不止,远大于斗棋牌中其他玩法。每次渲染场景,上图中红色区域中的像素都需要GPU重复绘制多次。
消消乐结算动画有三个,根据收益与投入比分别播放小奖动画、中奖动画和大奖动画,其中中奖动画和大奖动画比较复杂,其中中奖动画如下图所示:全屏纹理多达5个。
3、优化方案
针对消消乐发热严重的原因,提出以下优化措施:
1、将静态UI渲染到纹理,将静态多层纹理渲染到一个纹理上,可以有效减少同一个像素被重复绘制的次数,从而有效减少GPU的负担;
2、降低帧率,在不影响体验效果的情况下,适当降低帧率,将帧率限制在30帧;
3、简化部分结算动画,中奖动画和大奖动画比较复杂,全屏纹理较多,其中大奖动画出现概率较低,与美术同学商量后,适当简化了中奖动画。
下面重点介绍一下渲染到纹理的优化方案。
将静态UI渲染到纹理有如下两种方案:
方案一:
1、修改布局,将静态UI和动态UI分离,静态UI的子节点不包含动态UI;
2、将静态UI逐个渲染到纹理上;
3、将纹理挂到场景树上;
4、隐藏静态UI;
方案二:
1、修改布局,将静态UI和动态UI分离,静态UI的子节点不包含动态UI;
2、将动态UI隐藏;
3、将整个场景树渲染到纹理上;
4、将纹理挂到场景树上;
5、隐藏静态UI;
6、恢复动态UI展示;
方案一优缺点:
优点:不需要处理动态UI;
缺点:因为将静态UI逐个渲染到纹理,所以必须计算节点的各种变换矩阵,渲染完之后,需要还原变换矩阵,因为后续可能还会用到;
方案二优缺点:
优点:不需要结算节点变换矩阵,同时方案更具普适性;
缺点:需要处理动态UI;
通过对比以上两种方案的优缺点,最终选择了方案二。
致谢:优化方案由gladhu提出,kelvinxiong实现。
4、优化结果
测试设备:ipad 9.7
优化前:
优化后:
从上图可以看出,不管是待机状态还是消除过程中,GPU占用都明显降低。优化后消除过程中GPU占用还是比斗棋牌其他玩法高,是因为消除过程中,动画效果比较复杂,在不修改美术效果的前提下难以优化。
优化前iPhone7p真机测试半个小时,明显发烫;优化后,iPhone7p真机测试半个小时,已无明显发烫。
本文来自GAD,本文观点不代表GameLook立场,转载请联系原作者。