2016-11-28 128 views
2

我是SpriteKit和遊戲開發的總新手,我一直在玩SpriteKit來製作戰略遊戲。我的後端架構使用一個網格系統來表示宇宙,我有空的案例和案例系統/行星/等...我的網格是由GameplayKit支持GKGridGraph,我使用一種算法,生成隨機節點爲網格的每個節點添加屬性,並將其分類爲將自定義實體添加到它,這是此特定Universe案例的所有屬性。用SpriteKit渲染大網格

要渲染它,我只是用SKShapeNodeSKPriteNode各種顏色,形狀和質地。

我枚舉的所有節點(GKGridGraphNode)在我GKGridGraph實例,併爲每個這些節點我得到生成相應SKNode的(我的SKNode世代是每個GKGridGraphNode實體連接對象的部件),並且我設置它們的位置,並將它們添加爲我的主要節點(我們稱之爲mapNode),這是一個簡單的SKNode。最後它看起來像一個網格。

它適用於30/30網格,當滾動我的網格(自定義實現,我修改我的mapNode位置作爲用戶移動他的手指)時,我有60 FPS。 但是,當我嘗試50/50或100/100網格時,屏幕上的字節數太多,無法滾動。我知道我不應該添加的每個節點我的屏幕上,所以我想到了各種策略,我想對他們的一些輸入:

  • 而不是滾動我mapNode,我可能只呈現我看到的節點然後在用戶向左/向右/向上/向下滾動時添加/刪除節點。所以它不再是真正的滾動,它會模擬它。我能想到它,但實際上並不是我應該如何實施它。這是正確的解決方案嗎?

  • 也許我可以渲染我所有的節點作爲一個大節點?有沒有辦法做到這一點?但後來我會放鬆一些函數,如nodeAtPosition,我廣泛使用它來獲取與我的節點相關聯的實體(自定義對象)。

編輯:其實,我當前的代碼是開源的,這裏是我渲染場景:https://github.com/Dimillian/LittleOrion/blob/master/Little%20Orion/Little%20Orion/scenes/UniverseScene.swift

是否有這樣做的任何其他聰明的辦法?

+1

你確認這是慢實際的設備? – hamobi

+0

是的,模擬器上的17 FPS,設備上的靜態節點40 FPS,但是一旦你開始移動你的手指,它的失速就會低於1 FPS,並且你無法有效地滾動它。 – Dimillian

+1

當內容滾動時,您必須動態加載和卸載數據到精靈套件節點。您無法提前加載所有數據,只需更改代碼即可動態測試方形重疊,以確定要加載和呈現哪些節點。這與平鋪基本相同,因此您可能希望查看iOS 10中的新Tile支持並在此基礎上進行構建。 – MoDJ

回答

2

SKTileMapNode在Xcode中8 https://www.raywenderlich.com/137216/whats-new-spritekit-ios-10-look-tile-maps

做只是爲了這個或者,你只需要加載在附近當前視圖中的節點。你需要一個算法來做到這一點,與地圖相比,這將是一個令人頭疼的問題。

我懷疑算法中會涉及檢查哪些節點是在視圖的.frame' and then using 'addChild' on them--concurrently, add a reference to them to an array, which you would check against next更新()and removeFromParent`如果他們不再可見.. 它會得到毛茸茸試圖優化這個雖然。目標是在每一端只加載少數幾個節點,這樣在移動攝像機時有一些緩衝區(更少的更新)。

您可以創建一個數學函數來預先確定哪些節點與當前幀座標相關的位置 - 因此您不必遍歷節點 - 但這需要更多的工作和頭痛 - 而這正是人們在遊戲機上開發的東西,與高端遊戲和有限的能力有關。

我推薦通過Direct3d/DirectX/OpenGL遊戲開發書籍進行瀏覽,以瞭解什麼會進入一切......他們不難發現:走進書店,尋找最厚/最重的本書 - 這將是DirectX遊戲開發書。

你會看到我們如何用SK中的30行來完成C++和低級AV框架中的數千行和向量演算。它會給你一個讚賞,理解和遊戲開發的角度,這將幫助你在你的SK旅程:)

+1

我對後端的工作原理有一些(非常)的基本知識,我已經把它作爲一個研究遊戲開發和遊戲引擎的愛好,所以我從一開始就知道添加屏幕上的每個節點都是低效的(除非SK做了一些魔術一個拉UITableView/UICollectionView重用),但我明白,SKTilMapNode做到這一點:D。其實我的桌子上有一本OpenGL書籍,呵呵,但如果全是亂碼的話,我喜歡閱讀:)但是,編碼遊戲和編碼引擎對我來說是一種破壞行爲,我沒有時間轉移到即使我很喜歡:( – Dimillian

+0

肯定,我只提出它,因爲你提到你是遊戲開發新手;)是的,確實是胡言亂語! – Fluidity

+0

是的,無論如何,我是新手,做這件事很新穎,便宜,因爲我採取了「最簡單」的方式:D但是,從應用程序開發中獲得非常有趣,一種非常不同的思考方式(我在看你更新循環)。 – Dimillian