2017-03-02 50 views
-1

更新 我刪除了大部分我的應用程序運行的進程,但仍觀察到這些「滯後」(場景進行渲染時)didFinishUpdate和下一個更新的博弈滯後。所以我嘗試了一個新項目(與XCode 8一起發佈的SpriteKit Demo項目並記錄了幀時間,即使在這裏,幀也是滯後的,請看下面的圖片:Frame time from SpriteKit demo。至少這對我的遊戲沒有影響, 「T使其更容易調試..: -/SpriteKit -

你可以觀察到同樣的效果你可以簡單地用下面的代碼記錄時間:

var cycleStart = Date().timeIntervalSince1970 
var cycleEnd = Date().timeIntervalSince1970 
var lastTime = TimeInterval() 
var delta = TimeInterval() 

override func update(_ currentTime: TimeInterval) { 
    delta = currentTime - lastTime 
    lastTime = currentTime 
    print("\(delta) \(cycleEnd-cycleStart)") 
    cycleStart = Date().timeIntervalSince1970 
} 

override func didFinishUpdate() { 
    cycleEnd = Date().timeIntervalSince1970 
} 

而且我一直在想,爲什麼滯後幀的持續時間會跳到33ms,這就是SpriteKit的工作方式,我的意思是如果不是所有進程都在時間上完成,下一幀會被跳過,而不是延長單個幀持續時間達到完成所有專業版所需的時間量正如事實?

原始問題 我的SpriteKit遊戲有時會滯後。不幸的是,我無法確定可能導致滯後的任何功能或過程。所以我試圖通過測量整個場景處理過程中的時間來縮小它的範圍。請看看圖: Plot: Total frame time vs. update->didFinishUpdate

我繪製進入update()函數,直到didFinishUpdate()之間的時間間隔被稱爲(橙色)和時間一個更新()和下次更新之間()函數,所以整個幀時間(藍色)。

我看不到延遲之間的direkt鏈接和update/didFinishUpdate之間的超長時間。看起來好像渲染過程對於某些幀需要更長的時間。

另一個有趣的觀察:正常幀速率是60(16.6ms),但「滯後」幀持續時間大約是33ms,所以30fps。

現在我的兩個問題: 1.是否有任何方法來分析渲染過程中發生了什麼? 2.你們有沒有觀察到類似的現象,顯然整個幀被跳過(如果這是對33ms幀的正確解釋)?

任何幫助,非常感謝!先謝謝你!

PS:在運行iOS 10.2的iPhone 7上記錄時間,該應用程序在swift3中編程。

+0

請添加一些代碼來說明問題,或者我們無法幫助很多 –

+0

我希望我可以添加一些代碼。由於所有函數都是在update()和didFinishUpdate()之間完全執行的,並且在滯後幀和長函數執行時間之間沒有可見關係,所以我不知道應該發佈哪些代碼部分。 – Kai

回答

0

我以前見過這種類型的問題,但在任何情況下都是我的錯。

最常見的原因是:

  • 上SKShapeNodes渲染的動畫(I僅僅有18個與每一個被旋轉的7個路徑)。
  • 更改非常大的背景圖像(在SKSprite節點中)
  • 在SKSprite動作的完成塊中進行重處理。
  • 在另一個線程中有很多(50000+)個對象實例超出範圍(即被釋放)。
  • 後臺線程中的其他繁重工作負載。

並非所有這些都會導致渲染延遲,但它們的確會在SKScene渲染中引起一些明顯的減速。

+0

謝謝,阿蘭!我在不同的後臺線程中進行了很多工作。我認爲這是從常規場景更新中消除操作的最佳方式。我會研究一下。但是你對大圖的評論聽起來更有希望。我有兩個精靈節點中的無限滾動背景。它們都具有約320x1000像素的交替圖像。很大,對吧?我希望這是問題。一旦我調查了結果,我就會發布結果。謝謝 – Kai