cocos2d開發學習五:精靈節點CCSpriteBatchNode的渲染和紋理集Texture Atlases記憶體最佳化

來源:互聯網
上載者:User

本章其實主要是系統的理解下Sprite精靈節點的建立,然後引入精靈節點和紋理集的概念

CCSprite 最簡單的產生方式就是用一個紋理貼圖。

CCSprite *_firstSp = [CCSprite spriteWithFile:@"icon.png"]; CGSize wins = [[CCDirector sharedDirector] winSize];    _firstSp.position = ccp(_firstSp.contentSize.width/2, wins.height/2);    [self addChild:_firstSp z:1];

動畫幀

上面是產生精靈的最近基本的一種方式,但是很多時候,

我們的一個精靈元素不會是那種靜止,單單只有一幀檔案組成,

而以一個精靈幀形式出現。

精靈幀說白了就是一個動畫

  // CCSprite *sp = [CCSprite spriteWithFile:@"ball0.png"];        //step1:首先要有一個精靈對象,當然你也可以用上面的的方式,建立一個初始化紋理的精靈對象。按上面的方法建立的好處是,後面如果你要計算精靈位置時,能擷取紋理暫居的空間大小,如果直接node的話,精靈佔據空間長寬應該都是0吧。        CCSprite *sp = [CCSprite node];        sp.position = CGPointMake(200, 200);               //step2:根據檔案名稱產生兩幀檔案放入數組        NSMutableArray *frames = [NSMutableArray arrayWithCapacity:2];        for (int i = 0; i<2; i++) {            //擷取紋理貼圖            NSString *file = [NSString stringWithFormat:@"ball%d.png",i];            CCTexture2D *text2d = [[CCTextureCache sharedTextureCache] addImage:file];                       //產生精靈幀            CCSpriteFrame *frame = [CCSpriteFrame frameWithTexture:text2d rect:CGRectMake(0, 0, text2d.contentSize.width, text2d.contentSize.height)];            //放進數組中            [frames addObject:frame];        }        //step3:產生精靈幀動畫動作        CCAnimation *ball = [CCAnimation animationWithSpriteFrames:frames delay:0.5];        CCAnimate *animate = [CCAnimate actionWithAnimation:ball];        CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate];        //step4:運行動畫幀。        [sp runAction:repeat];        [self addChild:sp z:1];

Tips:

1.這邊說一點,該方式擷取動畫幀是通過檔案名稱然後去資源檔拿去取的,然後資料上什麼都會告訴你一般資源的命名規則,就是以0,1,2,3,4結尾,相信大家都懂。

 2.cocos2d早期版本,也就是本書所用到的庫,還有

/** returns an Animation given it's name. */

-(CCAnimation*)animationByName: (NSString*) animationName;

/** adds an Animation to the Sprite. */

-(void) addAnimation: (CCAnimation*) animation;

就是能把幀動畫對象存放到了精靈節點中,同樣也可以擷取,但是在目前的最新版本中貌似沒有了該方法。

精靈節點批處理(CCSpriteBatchNode)

上面都只是針對產生一個精靈節點來說的,有時候我們會遇到情境中需要建立多個相同的精靈,

最原始的方法是我們一個建立,然後add到情境中。

而精靈節點的作用是可以把一些使用相同貼圖的精靈放在一起,只進行一次渲染,減少原本我們沒建立一個精靈渲染一次而需要消耗的時間。

CCSpriteBatchNode* batch = [CCSpriteBatchNode batchNodeWithFile:@"ball.png"]; [self addChild:batch];for (int i = 0; i < 100; i++){CCSprite* sprite = [CCSprite spriteWithFile:@”ball.png”]; [batch addChild:bullet]; }

CCSpriteBatchNode簡單理解起來很像一個層layer,精靈添加它裡面,最後它一次性渲染出來。

Tips:

1.紋理貼圖必須使用同一個檔案

 2.每個子精靈都是用相同的z-order(深度)。

關於紋理貼圖集(Texture Atlases)

簡單來說,比如前面我用到兩幀動畫需要兩個圖片,

那我們載入兩次來從資源檔中讀取這兩張圖片。

為什麼說紋理集的作用可以有效減少記憶體消耗,

這是因為ios在載入圖片分配記憶體大小時會將圖片長寬自動縮放到2的N次方,這個很好理解比如16*35的圖片,載入到記憶體是以16*64來的。

因此說用了紋理集能減小記憶體了,不是說你把幾個圖片合成到一個一個貼圖集裡,它就變小了,離亂上來說還是一樣大的,只不過紋理集合的話,我們只需載入一次,而如果單個載入,那麼載入多次,在這多次載入造成的因“2的N次方”引發的記憶體消耗顯然比只載入一次來的更加危險性了。

貼圖紋理集,說簡單就是把你原來分散的一個個小圖片憑藉成一個大圖,工具會自動產生一個plist檔案來儲存每個單元貼圖的大小以及以及在貼圖中位置資訊等。

紋理集製作工具,資料上說用Zwoptex,但是我在論壇搜尋到一個“TexturePacker”。有人說要收費,但是貌似下載下來是免費的啊,難道是在appStore下載要收費~

對於貼圖紋理集載入

CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];          [frameCache addSpriteFramesWithFile:@"xxxx.plist"];

這樣就是把一張紋理集合載入緩衝到了記憶體。

需要用到某個貼圖時

CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];          CCSpriteFrame* frame = [frameCache spriteFrameByName:pngname];

Tips:

1.資料上說了一種簡單估算一個圖片會佔記憶體大小,比如一種16*16的,那麼占的記憶體是16*16*4=1kb(應該沒錯吧。呵呵,資料上說512*512*4 = 1M)。

2.CCSpriteFrameCache載入的是一張拼接過的大圖,每一個小圖只是大圖中的一個地區,這些地區資訊都在plist檔案中儲存。

用的時候只需要根據小圖的名稱就可以載入到這個地區;

CCTextureCache 是普通的圖片緩衝,我們所有直接載入的圖片都會預設放到這個緩衝中,以提高調用效率。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.