2014-09-22 52 views
1

這裏我優化了我的精靈套件代碼,試圖測試我的遊戲引擎的邊界。優化SpriteKit

使用儀器時,剖析我修復了大部分我自己的問題,現在停留在唯一的瓶頸是

37.0ms 66.0% 0,0  -[SKTextureAtlas textureNamed:] 

(我的遊戲加載了大量的精靈從TextureAtlases每半秒) 怪異的事情是的,似乎在我的大多數測試中一直持續下去,似乎純粹的NSString-名稱比較導致了上述方法中超過三分之一的工作。 這裏的樹:

15.0ms 26.7% 0,0   -[NSString caseInsensitiveCompare:] 
15.0ms 26.7% 0,0   -[NSString compare:options:range:] 
15.0ms 26.7% 0,0   -[NSString compare:options:range:locale:] 
15.0ms 26.7% 6,0   CFStringCompareWithOptionsAndLocale 

對於一些這樣的表現,重要的,是蘋果提供的字符串比較真的那麼差嗎?爲什麼他們不能提供更簡單的方式來訪問地圖集中的紋理,我們在這裏不需要花哨的字符串,它可以通過int來迭代我們所關心的。

有沒有比較的經驗呢?

+0

你有預裝在你的遊戲中使用的紋理? – ZeMoon 2014-09-23 05:08:07

回答

10

是的,避免在遊戲運行時使用textureNamed:(經常)。即使預加載紋理也需要時間積累。

而是在本地(在使用它們的類中)在單獨的ivars或NSArray或NSDictionary ivars中緩存所需的紋理。

+0

* facepalm *我完全沒有想到這一點,謝謝。實際上,我已經將所有動畫存儲在一個單獨的數組字典中,並且速度也很快。將報告性能差異。 – Bersaelor 2014-09-23 08:06:43

+0

我通過'std :: unordered_map '緩存了紋理,因爲無論如何我的鍵都是std :: strings。之前快4倍,謝謝! – Bersaelor 2014-09-23 11:32:59

+2

這只是爲我節省了很多時間!我無法弄清楚爲什麼我的記憶經過屋頂並花了很長時間才能載入。我雖然重複使用紋理,如果他們有相同的圖像名稱。加載SKSpriteNodes spriteNodeWithImageNamed:275MB 30秒加載。在臨時可變字典中拋出紋理並使用spriteNodeWithTexture加載:加載時間小於一秒27MB。 – 2015-01-24 06:46:13

1

我做了一個@ LearnCocos2D的答案的Swift實現,這是爲了避免重複加載相同的紋理。我創建了靜態紋理變量枚舉和一個getter來訪問它們:

enum GameTextures { 
    case Hero 
    case Foe 

    private static let heroTexture = SKTexture(image: UIImage(named: "hero-texture") ?? UIImage()) 
    private static let foeTexture = SKTexture(image: UIImage(named: "foe-texture") ?? UIImage()) 

    var texture: UIImage { 
     get { 
     switch self { 
     case .Hero: return GameTextures.heroTexture 
     case .Foe: return GameTextures.foeTexture 
     } 
    } 
} 

所以,當我需要一個紋理,我可以簡單地這樣做:

heroSpriteNode.texture = GameTextures.Hero.texture 
+0

謝謝,我會測試看看我是否得到任何性能改進。你應該不是返回一個紋理而不是UIImage? 'var texture:SKTexture {...' – 2017-10-19 08:22:56

+1

好抓:)是的,我想我打算用紋理初始化圖像,但是我很久以前就寫過 – 2017-10-19 11:37:16