问题描述:
在项目中对于常常要在一个ListView中加载大量Item这种需求应该都是比较常见的需求。按一般的做法我们常常会遇到如下瓶颈问题:
1、大量加载导致界面加载需要等待比较长的时间
2、大量加载Item那么Item中的图片资源会消耗太多内存
现在将我的解决方案分享出来(只给出的大致的描述,如果要实现细节代码的可以联系我)。
解决方案一:
方案描述:
起初的时候我采用的的方案是分帧去加载这些Item以此来解决加载页面等待过长的问题,然后给每个Item都加一个定时器去监视Item的位置变化,当Item的位置超出2个屏幕了我就讲Item相关的图片资源释放掉,待Item进入2屏幕的时候讲Item的资源恢复回来。
方案实现方法:
分帧加载的方法。这个方法其实我是利用了lua的携程来做的。通过创建一个携程,然后每次加载一个Item就将携程挂起,然后通过update每过一帧就将携程唤醒。这样就实现了分帧的功能。
Item监听方法,给每个Item都增加一个定时器不断去判断Item的当前位置
方案效果:
1、此方案,可以保证界面打开时可以立即打开,不需要等待加载。因为加载工作已经分帧加载了。
方案缺陷:
最初用这个方案的时候感觉效果一般,虽然可以通过控制lua携程来控制物品的加载,但是感觉lua携程的切换还是蛮耗性能的。
而且由于Item是分帧加载进入ListView的,所以感觉拖动ListView的时候会有点不流畅的感觉。
另外由于每个Item都增加了定时器(虽然可以通过一定策略让定时器计算工作非常少),导致还是有性能的消耗。
总的来说这个方案不是很好。
解决方案二:
方案描述:
由于经历了方案一,我开始选择了方案二。此方案通过首先给Item包一层Layout并提供一个init 接口将Item的全部初始化工作放在其中。然后在一开始将要加的Item的Layout全部加入不初始化(ListView 加载一个Layout是非常快的)。给ListView增加一个定时器,定时去监视ListView的InnerContainer (getInnerContainer () 获得) 的位置变化来控制Item的Init,和Item的资源的释放问题。这样才一开始的时候ListView只会Init少量的Item。但是这样还是会导致用户等待界面的加载一定时间中。所以我又将方案一种的分帧结合过来了。将ListView 的前几个Item通过分帧加载实现,然后Item资源的释放工作和动态加载过程交给ListView的监视器去做。
方案实现方法:
1、Layout包裹层,通过一个将Item的基本属性数据传递给这个包裹的Layout层。然后将Item的具体耗时的初始化操作都放在Init接口中。
2、ListView InnerContainer 的监视,由于ListView的Item其实都是贴在InnerContainer这个Layout上的。所以可以通过监视它来监视ListView中Item的移动。
3、分帧加载方法看方案一。
方案效果:
1、此方案,可以保证界面打开时可以立即打开,不需要等待加载。
2 、由于一开始就将所有Item所需的位置空间通过Layout包裹层站好位置了。所以不会出现动态加载导致ListView的InnerContainer的size变化,导致拖动ListView的不流畅问题。
3、通过一个监视器就实现了Item资源的监视问题和加载问题。减少了不少的开销。
方案缺陷:
目前感觉这个方案还不错
原文链接:https://www.f2er.com/cocos2dx/346134.html