2016-12-01 75 views
4

是否有足夠的方法將貼花(紋理)添加到SCNNode? 現在我所能做的就是創建新的SCNNodeSCNPlane幾何圖形 爲它的漫反射內容分配紋理並將其添加到場景中... 這種方法效率很低。SceneKit Cocoa添加貼花

我想添加一個不會成爲場景一部分的貼花 - 提高遊戲性能。 ,因爲我想在樓層節點上有相對大量的貼花。

也許有點類似於粒子內部工作? 或其他一些快速圖像繪製方法。

我已經嘗試@ rickster的建議數1

使用SKEffectNode作爲SpriteKit場景中的緩衝 - 拋飛濺 到效果節點,直到它到達一定數目的孩子, 然後打開其shouldRasterize選項,以便它不再重新呈現 其子項(並開始使用新的效果節點以獲得更多 飛濺)。

在同一個SceneKit showreel項目中 - 這一項已經給出了很好的結果,FPS並沒有像5分鐘的時間繼續播放這個很好的場景。

期待落實建議#2 - 我相信會減少爲2D場景的渲染時間(這是一個相當大的現在)。

在這個屏幕截圖有5K貼花

5k

+1

您需要手動緩存你的飛機,在一個陣列,並找到一種方法來繪製到他們的效率,並把它們作爲顆粒你的時候需要他們,根據需要和他們的內容。正如你所說,正如你所說,就像粒子一樣,只是一個完全加載的粒子系統,並隨時準備取消隱藏和放置SCNPlanes,在需要的地方,當你需要的時候......所以沒有任何實例化/創建時間的丟失。 – Confused

+0

我不確定Cocoa和你的問題有什麼關係。這可能會讓一些人感到困惑。當然讓我困惑。但我... – Confused

+0

@Confused可可 - 嗯,我可以合併2張圖片,並將結果作爲材質 - >效率= 0 – ColdSteel

回答

2

我建議使用SpriteKit場景作爲你的「噴濺式」幾何形狀的材料。蘋果有sample code,說明很多你要什麼,這裏的:

  1. 做一個SpriteKit場景是爲SceneKit幾何形狀的材料。
  2. 當事情在3D世界需要做出飛濺,請使用匹配的測試來查找紋理座標在材料和轉換那些SpriteKit場景座標。
  3. 在SpriteKit場景中放置一個Sprite以創建貼圖。

通過您的other question來判斷,您似乎已經開始朝這個方向前進......如果您解決更多問題,您會得到更好的幫助嗎?


注意:該示例代碼在iOS 9/macOS 10.11及更高版本中存在一個錯誤,這會干擾飛濺效果。您可以在AAPLGameViewController.m解決它通過查找該行:

ball.physicsBody.collisionBitMask = ~(0x4); 

,加入後,這一行:

ball.physicsBody.contactTestBitMask = ~(0x4); 

你會在演示可能會注意到,一段時間後,你的框架速度開始下降 - SpriteKit場景中越來越多的精靈使得2D渲染越來越多地渲染渲染循環。

enter image description here (這或許是促使問題的other question?)

有一些方法來優化這種情況下,雖然,即使沒有能力「屏幕截圖」的紋理。一些想法進行調查:

  1. 使用SKEffectNode如SpriteKit場景中的緩衝 - 拋飛濺到效果節點,直到它到達一定數目的孩子,然後在其shouldRasterize選項打開,使其不重新渲染自己的孩子(並開始使用新的效果節點以獲得更多的飛濺)。

  2. 大量的2D時間浪費在繪製SK精靈上,因爲它們被埋在其他精靈之下而不可見。 (或者大部分是隱藏的,只有幾個像素是可見的。)由於你的這個「paint」是完全相同的顏色,所以你可以使用一些簡單的方法將你的SpriteKit場景組裝成區域並決定一個區域何時完全覆蓋 - 在這一點上,你可以刪除該區域的所有精靈,用一個「全覆蓋」精靈替換它們,並停止在該區域添加新的精靈。 A quadtree可能是一個很好的工具在這裏使用。

  3. 如果您想通過着色器修改器(而不是基於SpriteKit的材質)進行自定義繪圖,那麼SceneKit命中測試到紋理座標映射技巧的工作方式也同樣適用,並且您可能能夠找到更有效的方法在那裏追蹤長期覆蓋(可能會得到#3中一些技巧的幫助)。

  4. 如果您的飛濺不會太頻繁發生,您可以在CPU上渲染它們,並在材質上設置一個新圖像。

  5. 一個想法的一個長鏡頭,不知道是否會工作或成爲高性能:採用Core Image as an accumulation buffer油漆飛濺,並呈現到該物質的含量設定爲相同MTLTexture。 (使用SceneKit的willRenderScene回調到每幀渲染一次。)

+0

我有一個關於SKScene內部SCNMaterial的子問題 - 它會默認忽略子邊界順序,還是應該爲每個節點指定一個Z位置? – ColdSteel