针对cocos2dx运行时内存占用做的一个小优化。我使用gDEBugger断点住项目中的某一帧,发现内存中部分textureList如下图:
这些都是文本占用的纹理,但是发现一个问题,这些纹理都是512*512大小,但是有些纹理其实比较浪费,如下图:
可以看到这么大的纹理保存的信息就只有这么一点(这里面的字符串是游戏内用来打印内存占用的label文本)。随后我看了这部分的源码,才了解到这块的实现方式:
以字体&&字体大小为key,每个key对应申请一块512*512大小的空间去创建纹理,用于保存该字体及该字体大小的所有文本format之后的纹理。对!也就是说,如果你游戏中有用到同一个字体的18、19、20、21、22号大小,就会为每种字体大小申请一个512*512大小,哪怕其实根本不需要这么大的空间,个人觉得这个是很不合理的,key的组成代码如下图:
接下来就是对这块进行优化了,从两个方面入手:
1.修改源码,看看能否合并纹理,减少纹理的浪费;
但是,发现这块的源码不太容易修改。其实主要问题是fontAtlas的构造函数这里申请的内存空间过大,结合项目的实际情况,我觉得512*512略大,因为大多数创建的用于储存文本的纹理都只用了四分之一甚至更少,所以我将这个默认的尺寸定义改成了256*256(这里需要科普一下,按照源码的实现,如果一张512*512的纹理满足不了该字体&&字号的所有文本,也就是装不下的话,会再申请一块512*512大小的纹理内存,以此类推,直到装满为止,所以我这里的修改也不会有纹理大小不够用的风险,因为不够的时候同样会申请一块新的256*256尺寸的纹理空间)。修改代码位置如下:
@H_301_32@ 实践证明,以上优化效果还不错,降低了一定的运行时内存,同时也减少了drawcall,因为每个纹理都会占用一个drawcall,所以减少使用的字号数也降低了一定的drawcall。 原文链接:https://www.f2er.com/cocos2dx/339181.html