有关项目的内存优化(1)

最近时间比较紧,所以有关项目中的优化,特别是内存优化,一直没来得及做好,本来想找一个机会彻底处理好的,看能只能等下个阶段处理好这种问题了。我们开发产品的时候,会发现兼容性是一个比较大的问题。产品不可能说仅仅兼容最新的设备,例如iphoneX或者安卓7.0。事实上考虑到很多用户的实际情况,很多用户使用的还是2014年的ipad mini而不是ipad

air。


在此情况之下,我也清楚某些比较old设备的情况了,我们一起看一下各个苹果设备的内存限制情况:


设备                      内存                       建议内存

Ipad mini1                512M                        170-180M

Ipad mini2                1024M                       320-450M

Ipad1                     256M                        40-80M

Ipad2                     512M                        170-180M


这里并没有贴上iphone1,iphone2,iphone3设备的内存以及建议内存,毕竟这些设备的使用量几乎被后面的iphone6,iphone7,iphone8替代了,不过ipad mini系列的使用量还是比较大的,即使是2014年,2015年的产品使用量还是有的。因为这个问题,所以项目必须做一次内存优化。


内存优化要做的要点有:


第一点:plist图集文件的集中使用。这里说明的意思是,图集资源必须某一个仅仅支持某个UI,而不是说,UI加载了该图集,但是该图集存在其他的不需要用到的资源。例如a.json,a.csb,我们用到了a.plist中的50个文件,但是事实上里面有100个小图组成的大图,这样加载到内存中的plist以及对应的图集文件,消耗了一倍的内存,但是用到的却不及一半,如此下去内存急速增长,所以设备会撑不住,直接黑屏。


第二点:缓存的使用,应该谨慎。这次要优化的主要也是缓存。缓存使用得好,那是巧妙,使用得不好,内存同样会急剧飙升。我平时有注意到,有一些图集资源是长期加载到内存张的,并没有释放。但是即使是这么一点的内存不释放,引起的后果也是惊人的,由于其他的图集渲染很厉害,最后整个消耗的内存非常厉害,于是在比较老的设备上面出现问题,所以这也要是要优化的方向。那么实际上我们到底应不应该使用缓存呢。


就这一点,缓存的使用肯定是有价值的,例如切换纹理,例如精灵帧的缓存,又如动画的缓存,我们使用到这些缓存技术,主要是为了在一些复用的地方,又或者数组的地方,可以实现复用。最现实的意义是,切换纹理,又或者精灵帧的复用,可以一次性直接从内存中读取精灵块,而不用一个一个的创建,速度快了很多,渲染也快了很多。可以在一定程度上面降低GPU和CPU的内存占用。当然这些是建立在可靠的加载和释放的情况下,如果出现大时间段内的不释放,那么内存出现问题,也是常见的,所以最后的方案是:按照场景进行预加载需要的缓存,需要的时候,就使用,不需要的时候,就主动释放。具体的时机就是:OnEnter进行加载,OnExit进行释放掉,这样就可以实现内存的有效管理了。目前项目中,存在的缓存是一次性加载到内存中,考虑到高效性,所以并没有按照场景进行阶段性的释放和加载,这是这次优化必须做的。


第三点:要谨慎使用ImageView,精灵,按钮。我们知道使用渲染的消耗单位,精灵是1单位,ImageView是2单位,按钮则是3单位。不能因为渲染的差距不大,就可以频繁使用按钮或者ImageView,基本上内存需求太多就是因为精灵,ImageView以及按钮的使用不当造成的。这个时候,我们可以考虑的方案是,如果必须要有触摸效果,我们可以采用代码实现按钮的一些效果,而不是直接去使用按钮。多一些渲染单位,对内存的需求就增多了,自然也就容易黑屏崩溃了。


第四点:扁平节点设计。扁平的节点设计,这个比较重要,我们最好不要建立太多的图集或者文件的读取目录,相反应该追求尽可能在一个地方读取。虽然管理起来并不方案,但是对于渲染而言,速度却快了很多!另外一点,图集的复用性,图片的复用性。不要总是把某些类似的图片或者图集进行重复的制造轮子。不能因为类似的功能在两处不同功能的地方,就使用两次类似的文件,这样不对,不仅加载了内存的消耗,同时也加大了资源的消耗,造成了资源管理的不方便。要尽可能少的进行文件读取,次数越少越好,减少CPU的文件读写操作消耗的内存。在UI设计设计方面,尽可能扁平化,不要设计太深的节点。当然这一点我们知道,但是行动起来总是忘记了,其实很多时候还是因为为了追求自认为合理的结构,所以就加深了层次结构,这是要改善的地方。


以上四点是内存优化过程中的一部分。第四点则是多个内存优化的集合。后面会继续讲解内存优化,花较多的篇幅说明内存优化的过程和详细细节。

你可能感兴趣的:(有关项目的内存优化(1))