啊,好吧,我剛剛在另一個線程中留下了一些對你的評論後纔看到這個。關於您所獲得的觸摸事件的頻率,您有點兒處於操作系統的擺佈之中。您需要嘗試限制這些時間段內佔用的帶寬。
這裏的問題是你的節點樹有多大?臨時添加一些代碼,以便通過手動走下樹來物理計算節點數量可能會很有用。你是否也在節點上應用縮放和旋轉並使用層次結構?如果是這樣,你也應該注意到,因爲它需要更多的計算。
仍然基於您之前描述的內容,如果真的耗盡了您的帶寬(假設您說有20個對象),我會感到驚訝。
或者,如果你真的想要你可以創建自己的包含。這實際上就是我所做的,但是這部分是我處理圖形的特殊需求的副產品。這就是說,我有數百個物體,而且我沒有明顯的問題。請注意,我並不像您一樣仔細檢查CPU使用情況。我只專注於FPS。
這段時間你的FPS是什麼?你也應該在設備上運行它,看看你的CPU/GPU使用情況是相對於幀的。 %CPU也可能有點懷疑我覺得基於其他因素,如果你正在記錄甚至有時,操作系統還在發生什麼。
最後嘗試將代碼移至太空船示例,並在添加更多太空船時注意效果。
添加詳細
所以,當我最初回答我予少取帳戶的問題變成,你在做什麼。我仍然認爲,你不應該過分試圖在此時此地優化了下來,但是看着SKOOP的回答,特別是
https://github.com/MitrophD/Swift-SpriteKit-Analog-Stick
這是有趣的代碼,給了我什麼,你一個更好的主意真想要做什麼以及如何根據需要擠出CPU使用量。遊戲編碼和優化背後的原則之一就是懶惰。 「我如何預先計算或做最少量的工作?」
這裏您需要對touchesBegin
和touchedEnd
/進行一些調整。在你的類是做觸摸處理添加一個名爲
var controllerTouch : UITouch?
注意,這是可選的,表示當前的接觸,是在控制器中的成員屬性。另外請注意,如果您正在進行多點觸控,則您將此定義爲一個規則:控制器內的第一次觸摸是控制觸摸。
這提出了另一個關鍵點,這是規則。你需要定義規則。在這裏,我要說的是,觸動一個主動控制器超出controllerBase
的範圍(這將像是最大化控制桿)並且控制器實際上應該是一個圓圈。最後,我將假設controllerBase
是靜態的。
現在,我可以採取一些方法來儘量減少所需的工作。
touchesBegin
由於這是靜態的,我應該通過觸摸的位置從controllerBase
中心比較的距離使用這個簡單的數學。我可以這樣做,因爲我們說這是一個圓圈。所以我應該知道半徑。因此,我的檢查將是這樣的:
let distance = computeDistance(pt0: controllerBaseCenter, pt1: location)
// We only care about doing this if we are not currently actively tracking
if controllerTouch == nil {
if distance < controllerBaseRadius {
// Where touch is the current touch
controllerTouch = touch
}
}
注意代碼沒有測試,編譯或如果它的工作原理,而它是做什麼的例子,假設需要你會解決它。我假設你將用正確的數學來代替computeDistance
來計算距離,這是一件微不足道的事情。你的距離也需要絕對的。
還有一件事要記住。由於controllerBase
是靜態的,你可以預先計算和存儲在變量的實際中心點(controllerBaseCenter
和半徑,這樣可以保護你不必做的節點上location
或contains
,從而節省了等待的週期,每次touchesStart
運行。
touchesEnd
/touchesCancelled
在這裏你會零出controllerTouch
如果它是結束/取消觸摸。如果有必要,你可以做任何其他通知邏輯。
處理,然後將真實的東西是
touchesMoved
所以在這裏,我們知道我們已經知道,如果我們通過controllerTouch
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch : AnyObject in touches {
if touch == controllerTouch {
// Only get location when needed (ie defer until you really need this)
let location = touch.location(in: self)
controlStick.position = location // You will need to adjust, see notes below to compensate for controllerBaseCenter if needed
}
}
}
有一個活躍的控制器注意我的延遲評論。在您的原始代碼中,您只需在需要時完成location
作業,即當觸摸位於controllerBase.frame
時。
現在,我已經省略了最後一件事。這將取決於您如何處理控制器可以移動的徑向距離。例如,如果半徑是64,並且我的觸摸距離60的中心有一段距離,那麼如何處理?你把這個偏移量作爲中心點嗎?如果是這種情況,則需要跟蹤第一次觸摸的位置以正確調整數學。
請記住,您需要讓玩家不必精確。另外請記住,他們不會經常低頭看管控制器區域來檢查事情。
我不確定我是否會擔心這一點。根據你的儀器日誌,你沒有使用大量的CPU。你會注意到渲染是你的最高消費者,而不是你的觸摸代碼。除非您需要更多地滾動以暴露它。嘗試在您的下一次運行中使用Xcode中的CPU儀表板,並查看這些數字如何運行。另外你的FPS是什麼? –
真的嗎?在Xcode上,他們建議我相信20%,除非你說如果FPS沒有受到很大影響,那麼不需要擔心什麼?我的FPS穩定60,直到遊戲後期(幾分鐘),當它降低到40秒 - 也沒有考慮到完整的遊戲玩法,只有控制器(這是一個單獨的項目,我正在重建應用程序) – Sam
現在嘗試運行Spaceships並查看它的CPU使用情況(減去幾分鐘後)。如果你的觸摸代碼消耗了很多,你會看到它顯示在呼叫樹中的更高位置,事實並非如此。我會說你的其他東西取得進展,並重新審視。讓FPS成爲你的指南。最後,你很可能會得到一個高CPU佔用率的遊戲,除非你正在做類似tic tac的腳趾;)。很顯然,下降意味着你面臨其他挑戰。 –