根據我所瞭解的cocos2d。 SpriteFrameCache和SpriteBatchNode具有相同的結果,但使用方式不同,如果您的遊戲非常大,則可能會注意到性能差異...
CCSpriteFrameCache根據何時根據plist文件命名它們的幀來加載幀被給了。與plist相關的地圖集也必須添加到項目中,否則將調用框架,但不會繪製任何內容。 Plist就像圖像位於圖像圖集內的地址。 CCSpriteFrameCache的好處在於代碼更整潔,比CCSpriteBatchNode方法小,代價是每次調用該框架時,都會轉到特定的地圖集並繪製它。
另一方面,CCSpriteBatchNode加載圖集並將其加載到一個繪圖調用中。這非常有效,因爲它可以減少遊戲中每次繪製需要完成的次數。這裏唯一的困難是你需要爲地圖集中的每個精靈的矩形做數學運算。這是因爲讓我們說你的地圖集是一個角色的兩個動作,地圖集圖像文件的大小爲1024x1024,每個精靈的大小爲128x128。所以你會做數學來獲得每個矩形的整個跳躍動作例如(這是.plist派上用場避免做這樣的數學)
代碼變得複雜,你可以看到,但它只會做一個電話,使其表現最明智的電話。 另一種使用CCSpriteBatchNode的方法是使用不同的靜態小精靈,並且您只需爲這些多個靜態圖像或精靈繪製調用。
如果你需要示例代碼只是問,我會很樂意提供它。
更新:爲SpriteBatchNode添加鏈接和我自己的示例。
SpriteBatchNode:
Example using SpriteBatchNode with Ray Wenderlich 我相信這個傢伙,我從他的教程瞭解到Cocos2D中的很多。我建議你閱讀他的其他教程。
簡而言之,CCSpriteBatchNode和CCSpriteFrameCache是唯一的區別,它將Sprite子節點添加到CCSpriteBatchNode而不是Layer,但是您將CCSpriteBatchNode添加到圖層的過程完全相同。 這是Cocos2d新入門者糾纏在一起的硬性概念。
SpriteFrameCache:
的SpriteFrameCache我無法找到一個很好的例子,所以這裏是一個簡單的問題。
//By doing this your sprites are now in the cache ready to be used
//by their names declared in the .plist file.
-(void) loadingSprites:(NSString*) plistName {
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName];
}
-(id)initGameLayer {
//CCSprite accepts CCSpriteFrame and your img is now ready to be displayed.
//However is still not drawn yet.
CCSprite * mySprite = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:framename];
//set a position if desired
//20 pixels to the right and 0 pixels to the top.
mySprite.position = CGPointMake(20,0);
//Now the Image has been drawn, making 1 draw call.
[self addChild:mySprite];
}
值得注意指出CCSpriteBatchNode使得僅有1 drawcall,但是,所有的精靈被添加到batchnode必須是同一SpriteAtlas的一部分。
而且使用SpriteFrameCache只有它更容易和簡單,但對於添加到層每一個孩子就意味着+1繪圖調用正在做(這是不利的一面,性能)
所以,如果你加10個到精靈與SpriteFrameCache的圖層,你將有10個drawcalls。
但是,如果你實現了SpriteBatchNode,並在CCSpriteBatchNode中添加這10個Sprites,而只是將該CCSpriteBatchNode添加到圖層中,那麼您將會添加相同的10個Sprites,但只會進行一次繪製調用。因此,性能差異(對於最好的)在較大的遊戲中將是顯着的。
希望它有幫助,乾杯!
謝謝。這清除了一切。 – Voldemort