2015-10-09 63 views
12

我遇到了iOS9的巨大性能問題,我無法弄清楚該怎麼做。我讀過很多文章 - 例如herehere,但他們建議的解決方案並沒有幫助,也沒有什麼區別。Sprite Kit的主要iOS9性能問題

我的遊戲已經從舊iPad 2(iOS 8.4)上的60fps變爲新iPad mini(iOS 9)上的每秒15fps <。

我試圖找出主要的罪魁禍首。我很確定其中之一是SKCropNodes。我通常在我的場景中渲染幾個SKCropNodes(6 - 18)。這在iOS8中從來都不是問題,但它看起來像iOS9,雖然它的剪裁效果更好,但它的表現也令人滿意。

如果我將裁剪節點渲染爲正常的SKSpriteNodes,那麼舊設備上的增益可能爲5fps,在較新的iPhone 6上可能增加到30fps。我沒有其他選擇使用裁剪節點,但它不能成爲整個問題。

我想也許是錯誤的紋理地圖集正在使用 - 即一個更大的分辨率。但是強迫我的設備使用非常小的圖集沒有任何區別。

我使用Texture Packer爲不同設備的縮放變體生成我的地圖集。我注意到XCAssets現在提供了一個添加Sprite Atlas的選項(我似乎無法找到關於此的任何文檔)。這不適合我的遊戲,因爲我使用了100多個精靈。我已經嘗試將我的地圖集添加到XCAssets,但由於某種原因,它不會使用縮放變體。儘管如此,低分辨率紋理仍然非常糟糕。

我已經嘗試設置

skView.ignoresSiblingOrder = YES; 

並給予我的所有節點z位置值,但仍然沒有效果。我還爲每個圖像名稱添加了.png擴展名(最初是一個意味着它們不會呈現的問題)。

我在場景中有一些SKEffectNodes,但刪除並添加這些似乎沒有效果。

我不明白相同的硬件和相同的代碼如何產生這種截然不同的結果。很明顯,蘋果已經改變了一些與渲染有關的事情,這些事情已經產生了不利影響。他們似乎也無意解決這些問題。我意識到在iOS9發佈之前的幾個月裏,這個問題一直存在。

我已經在這個遊戲上工作了2年,現在只在iOS9之前發佈。現在它正在遭受糟糕的表現,並且經常崩潰。

有沒有人知道Apple究竟幹了什麼?如果我知道這一點,我至少可以嘗試解決它......謝謝。

UPDATE

下面是同一場景的一些數字,隨着遊戲會產生在同一時間節點的絕對最大數量。

iOS 8的,iPad 2的〜200個節點,〜100平58.7 - 60幀

的iOS 9,iPhone6,〜280個節點,〜216繪製,約20 fps的

我假定的差節點數量是由於不同的屏幕尺寸。如果我改變對iPhone 6現場實現等效值時,FPS仍然是圍繞24

更新2

使用Xcode的模板雪碧套件項目,改變飛船的SKCropNode含飛船,在iOS 8上,我可以添加100個沒有幀速率問題的船隻。在iOS 9,同一個項目,我可以iPad2的添加約25之前的幀速率下降到< 30.

的iOS 8:

enter image description here

的iOS 9 iPhone 5:

enter image description here

在紋理地圖集的使用方面,如我的評論,我不能保證任何東西都將從相同的地圖集繪製。我的遊戲包含自定義字符,來自一系列地圖集(每個地圖包含〜100個紋理)。屏幕上一次最多可以顯示9個字符。我明白這不是最有效的吸引方面,但我從來沒有遇到過的問題,直到iOS9 ...

更新3

我已經提交一個bug蘋果公司,包括我示例程序。我也用完了我的一項技術支持請求。迄今爲止,蘋果沒有任何東西。

+1

請更新與相關性能信息,比如你的問題:繪製調用和FPS數對8和9,儀器時間和8與9等fps配置文件等。 – quellish

+0

好吧,我已經添加了一些更多的信息。即使在同一場景中的iPhone 6和iPad 2上,性能也會大幅下降。 – Smikey

+0

@Smikey關於抽籤計數(與抽籤問題無關)即使100次抽籤對於200個節點來說也太多了。 。首先確保你正確使用地圖集。請閱讀此部分了解有關可以中斷批處理過程的更多信息:http://stackoverflow.com/a/22856964/3402095。其次,你必須記住SKLabelNode,SKShapeNode和SKCropNode需要(至少)每個節點一次繪製調用。那些不能像SKSpriteNode那樣批量繪製。 – Whirlwind

回答

7

似乎iOS9的大部分問題都在最新的iOS9.2 beta & Xcode 7.2 beta中解決。

謝謝蘋果終於解決這個問題。太糟糕了,我花了2個月時間研究解決方法。

我一直在Apple的論壇上發帖,提交bug和與支持技術人員溝通。令人遺憾的是,Apple從未明確表示過他們意識到的問題以及Sprite Kit團隊正在處理的內容。

儘管如此,至少它似乎多數雪碧套件的問題現在解決了,轉行不再是必要的:]

+0

你知道這個問題是自iOS 7還是自8以來解決? – Beto

+0

9.3的早期測試版顯示出對之前的問題以及一些新問題的一些回報。 Sprite Kit的所有降級性能。 – Confused

1

很多抽獎......你有沒有試過這個?

skView.ignoresSiblingOrder = YES; 
+3

是的 - 看到問題! – Smikey

0

你在使用SKLightNode嗎?如果是這樣,請嘗試從代碼中刪除所有光節點。我這樣做了,我的遊戲像iOS8一樣在60fps下運行。

來源:SKLightNode performance issues

+0

不好,不幸的是SKLightNodes ... – Smikey

5

在你提供我能看到改善平局計,並驗證作物節點是沒有問題的一種方法的例子。我不知道你的實際比賽有多實用,但是這大大限制了你的平局。

#import "GameScene.h" 

@interface GameScene() 

@property(nonatomic, strong)SKTexture *spaceshipTexture; 
@end 

@implementation GameScene 

-(void)didMoveToView:(SKView *)view { 
    /* Setup your scene here */ 
    SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; 

    myLabel.text = @"Hello, World!"; 
    myLabel.fontSize = 45; 
    myLabel.position = CGPointMake(CGRectGetMidX(self.frame), 
            CGRectGetMidY(self.frame)); 

    [self addChild:myLabel]; 

    //Create one texture to be used over an over 
    SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    sprite.xScale = 0.5; 
    sprite.yScale = 0.5; 

    SKCropNode *cropNode = [[SKCropNode alloc] init]; 
    SKSpriteNode *mask = [SKSpriteNode spriteNodeWithColor:[UIColor blackColor] size:CGSizeMake(100, 100)]; 
    mask.position = sprite.position; 
    [cropNode setMaskNode:mask]; 
    [cropNode addChild:sprite]; 
    [self addChild:cropNode]; 

    //temp add to scene to create the texture than remove 
    //keep pointer to texture so it can be reused 
    self.spaceshipTexture = [self.view textureFromNode:cropNode]; 
    [cropNode removeFromParent]; 

} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    /* Called when a touch begins */ 

    for (UITouch *touch in touches) { 
     CGPoint location = [touch locationInNode:self]; 

     //re use texture 
     SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:self.spaceshipTexture]; 
     sprite.position = location; 
     [self addChild:sprite]; 
    } 
} 

@end 

不利的一點是,當屏幕上顯示120+個ish節點時,問題仍然存在。

另請注意我使用默認模板創建了一個新鮮的SpriteKit應用程序,並刪除了SKAction。不幸的是,即使默認的Apple模板在達到120多個節點時也會遭受巨大的fps下降。所以我不知道是否會有答案,而你的最佳行動方式是提交一份錯誤報告,因爲我相信它應該(並且能用來)在屏幕上處理這麼多而不會降低fps。

也未嘗值得一提的這個錯誤出現在這可能與默認的項目...

2015-10-20 10:46:50.640 Test[2218:658384] <CAMetalLayer: 0x15fe987c0>: calling -display has no effect. 

更新 做多一點研究,我就遇到了這個...

https://forums.developer.apple.com/thread/14487

看起來像其他人正在爲此提交錯誤...

+0

感謝您的努力。我嘗試過textureFromNode,但不幸的是它在我的遊戲中沒有用處,正如你注意到的,似乎並沒有改善這種情況。此外,您鏈接到的那個線索包含我自己的帖子關於問題。我還向Apple提交了一個bug,並用完了TIS請求。他們正在考慮這個問題,但Sprite Kit團隊本身沒有提供任何信息,只是被分配到我的案例中的那個人...... – Smikey

12

有兩個主要問題。

一個是Sprite Kit從iOS 8到iOS 9性能急劇下降,原因有很多,其中有一些與之相關,但也有其他一些。看起來渲染,排序和存儲/處理節點的許多方面要麼是破壞的,要麼是它們之前在CPU/GPU上的負載的兩倍或三倍。

然而,還有另一個問題進一步複合努力解決任何可能的性能問題。這是一種普遍且看似隨意的幀速率限制機制,當它以40fps的速度運行時,它是最常見的。但它也可以在其他頻率下工作。

多年來,當人們手動使用CADisplayLink在每幀基礎上創建遊戲循環或其他基於時間的機制時,人們很少會注意到這個上限。

對於iOS 9,這個看似自動的上限已成爲Sprite Kit,SceneKit,Metal和OpenGL ES應用程序中一個非常不受歡迎的「特性」。

在SceneKit的情況下,這是最有說服力的,因爲無論是渲染選擇 - 金屬還是OpenGL - 和所有設備,包括新的6S手機和iPad Air 2等,默認模板項目。

「渲染器」是設備上SceneKit,屏幕上的詳細統計數據中的一個行項目。這是封頂過程中最明顯的指示。當遊戲穩定在60fps時,它不在那裏。

當以40fps上限時,無論在屏幕上和邏輯上進行其他活動所需的時間量如何,該組件都會吸收遊戲循環中保持固定40fps上限所需的所有剩餘時間。它根據其他活動所需的時間而變化,始終強制底層操作系統的明確目標是將幀率保持在40fps。

此問題與iOS 9 Sprite Kit性能相關的問題一起,意味着目前可能無法解決所有問題。要確定何時碰到這些(看似)任意的fps帽,而不是造成了實際問題,這將是非常困難的。

正如一邊,這些帽不限於40fps。我注意到他們在30fps,24fps,20fps,15fps,12fps和8fps。

當然,蘋果公司在操作系統內從未承認或承認過這種限制機制,也沒有評論它何時/如何/爲何如此嚴重地影響遊戲和渲染過程。

我在這篇文章(Inconsistent SceneKit framerate)中表達的理論是,它是iOS設計的一部分,旨在促進即將在iPad Pro中使用可變幀頻技術,並可能在其他設備中使用。

120Hz成爲未來設備的基本價格是有道理的,尤其是考慮到對iOS性能優勢的關注,新款Apple TV和240Hz採樣的屏幕在iPad Pro內觸摸/筆......以及市場上有相當數量的120Hz電視機。即使沒有可變幀速率技術(比如......你的電視機),120Hz顯示速率意味着24fps的電影可以以穩定的5:5:5幀顯示模式播放 - 這大大增加了快樂/沉浸感當觀看電影時,幾乎所有這些都被拍攝並真正利用了真實24fps模糊和運動效果的優勢。

無論是採用可變幀頻技術還是5:5:5幀顯示,120Hz都可以節省Apple在電影壓縮和解壓縮方面的巨大努力,與當前在所有設備上使用的下拉方法相比, 60fps的。所有的猜測,但我猜想在遊戲引擎技術中使用這些幀率封裝是爲了幫助遊戲使用更少的功率,並且(在未來)讓開發者能夠選擇鎖定他們的遊戲在可變幀率設備世界中。非常不幸的是(如果是這種情況),他們做了這麼差的工作,或者整理了操作系統中的封頂問題和Sprite Kit的性質,導致一個場景,你盲目地爲了獲得好,高,一致的幀速率。

蘋果的沉默和對這兩類問題造成的問題表面上漠不關心的態度,很可能是他們對「遊戲開發社區」感覺如何的一個非常強烈的表現。

這是處理來自不必要的祕密和不通透的(幾乎​​是好戰的)組織的封閉源框架內的遊戲製作所固有的尖端和性能關鍵開發問題的最大單一問題。

+0

這是我讀過的關於該問題的最全面的信息。不幸的是,它令我最害怕的事情變得混亂 - 蘋果故意這樣做了,而不考慮遊戲開發者,因此不太可能解決它。我會盡量減少使用更新循環來查看是否有幫助。在這一點上,我會很高興40fps。感謝您的信息,雖然有助於更多地瞭解發生了什麼,即使看起來沒有太多我可以做的事情... – Smikey

+0

對不起,目前沒有明顯的解決方案,缺乏來自蘋果公司的溝通非常傲慢。可能是第一家公開對獨立遊戲開發人員不滿一代以上的人不屑一顧的公司。 – Confused

+0

我其實並不認爲我的問題屬於幀率鎖定。相反,正如你在開始時所建議的那樣 - 由於某種原因,iOS9的CPU/GPU負載增加了一倍或三倍。在iPad2上更新至9.1後,我的遊戲崩潰嘗試打開之前在iOS8上以60fps運行的場景。我可能不得不現在就從App Store取下它......我想知道蘋果是否有意鼓勵用戶升級到新硬件:/ – Smikey