2013-09-21 32 views
5

我嘗試SpriteKit具有以下設置:如何申請全屏SKEffectNode後期處理中SpriteKit

  1. 的SKScene與僅用於分組其他 節點兩個子節點:前景和背景。
  2. 背景現在真的是空的,但最終會保留一些 類型的背景精靈/圖層。
  3. 前景是SKEffectNode並且每當用戶輕敲 屏幕,SKnode子類表示遊戲 元素被添加作爲子給它的一個新intance上。
  4. 該SKNode子類基本上創建3個SKShapeNodes和兩個標籤:外圍 圓周,內圓周,2個標籤和內四分之一圓周。內部四分之一圓周有一個SKYction,它使得它永遠圍繞其原點/中心旋轉。

現在,這裏的問題,只要前景沒有任何CIFilter或shouldEnableEffects = NO,一切都很好。也就是說,我可以在屏幕上點擊,我的遊戲元素被實例化並添加到主場景中。但是,當我嘗試將CIGaussianBlur或CIBloom添加到前景時,我注意到兩件事:

  1. 幀速下降到大約2fps。請注意,這種情況即使在場景中只有6個節點活動的情況下也會發生。
  2. 效果似乎不斷裁剪其內容或調整 它的框架。也就是說,如果我有一個節點,那麼「全屏」效果似乎會嘗試並不斷裁剪或調整其邊界,以保持所有節點所需的最小面積 。這是一個節點:

    enter image description here

這是2個節點:

enter image description here

在OpenGL ES中2,一個將被基本呈現做後模糊/大整個幀緩衝區(所有對象)進行紋理處理,然後對該紋理執行至少一次以上模糊等處理,然後將其呈現在附着在顯示器上的幀緩衝區中,或者將其與原始渲染進行組合,然後將其渲染回幀緩衝區。我希望SKEffectNode以類似的方式工作。然而,裁剪和糟糕的表現讓我覺得我可能以錯誤的方式使用效果節點。有什麼想法嗎?

回答

2

它似乎是一個SKEffectNode嘗試應用篩選器在兒童SKShapeNodes上的錯誤,據我所知。我玩過這個並獲得了結果,但是當我切換SKSpriteNodes的SKShapeNodes(使用一個簡單的png圓)時,裁剪不再出現。這是一個錯誤,因爲SKEffectNode無法很好地處理SKShapeNode的筆畫。如果你取下筆畫(lineWidth = 0)並給它一個填充顏色,你會看到沒有剪裁。

至於幀率,SKShapeNodes表現不佳。切換到前面提到的SKSpriteNodes時,我在屏幕(iPhone 5)上應用了過濾器的35個節點時,將我的fps從40增加到了50。

+1

現在我想到了,可能有一個解決方法:SKView由CAEAGLLayer支持,甚至有一個返回SKTexture的-textureFromNode屬性。如果我設置自己的GL着色器進行模糊/模糊處理,我可以抓取每一幀(通過屬性或者甚至通過使用我自己的OpenGL上下文切入圖層本身),後處理它並將其呈現回SKView的圖層或新的CAEAGLLayer。 – SaldaVonSchwartz

+1

你可以評論這個解決方法是否有效嗎?我試圖弄清楚你是否可以使用Sprite Kit做你自己的後期處理效果? – Oscar