标签:
2014-11-17阅读599 评论3
在项目中对于常常要在一个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资源的监视问题和加载问题。减少了不少的开销。
目前感觉这个方案还不错
2014-11-17 12:14600人阅读 评论(3)
cocos2dx ListView 大量 Item 加载方案(转)
标签:
原文地址:http://www.cnblogs.com/dudu580231/p/4916844.html
3楼binxindoudou2015-05-23 12:39
您好,看了您的cocos2dx ListView 大量 Item 加载方案 http://blog.csdn.net/xzben/article/details/41206707 我想问下,您的listview监视器是如何做内存的动态加载和删除的,我先在总是处理不好io读取和内存控制的平衡,现在内存控制到几个item的内存,可是滑动过程中会引发大量的io操作。 然后您使用到了TextureCache的addImageAsync吗?这个开了一个线程,使用一个缓冲池,然后依次做io读取,但是在list的快速滑动过程中,许多已经已出屏幕,却已经发送了addImageAsync操作,就扔在缓冲池中做异步加载工作,而且还需要等待一个一个加载完成之后才能执行到屏幕上正在显示的。不知道可不可以点拨一下。 如果方便的话,可以将您这部分内存控制的源码让我参考下吗?谢谢了。 1178860689@qq.com
2楼xzben2014-12-31 13:55
你说的源码是cocos2dx 的源码么?不需要哦!
1楼liying4262014-12-17 17:43
求第二种方法的代码~~~这个需要改源码吧