【cocos2dx】文本占用内存优化及减少drawcall

    针对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尺寸的纹理空间)。修改代码位置如下:



    2.与策划沟通,确定游戏中只存在大中小三个字号,例如22,20,18,三个字号,这样确保不会因为用到的字号太多,而每个字号内文本占用纹理内存却不多的情况,避免浪费太多的运行时内存空间。


    实践证明,以上优化效果还不错,降低了一定的运行时内存,同时也减少了drawcall,因为每个纹理都会占用一个drawcall,所以减少使用的字号数也降低了一定的drawcall。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值