cocos2dx ListView 大量 Item 加載方案(轉)


[原]cocos2dx ListView 大量 Item 加載方案

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資源的監視問題和加載問題。減少了不少的開銷。 

     方案缺陷:

       目前感覺這個方案還不錯

 

 

查看評論
  • 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

    求第二種方法的代碼~~~這個需要改源碼吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM