cocos2dx ListView 大量 Item 加载方案

问题描述:

在项目中对于常常要在一个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资源的监视问题和加载问题。减少了不少的开销。

方案缺陷:

目前感觉这个方案还不错

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...