2016-01-24 52 views
3

對於全景查看應用程序,我想在UICollectionView中並排顯示多個全景圖。單個全景圖被表示爲立方體貼圖紋理。渲染是使用Scene Kit完成的。Scene Kit:並排使用多個SCNView實例

當使用單個SCNView時,應用程序性能良好。當我並排實例化多個SCNView時,所有SCNViews的幀頻直線下降到幾乎每秒一幀。 GPU和CPU利用率幾乎爲零。

單SCNViews的佈置在下面可以看到:

Arrangement of the SCNViews

我觀察到每個SCNView產生一個單獨的渲染線程。無論天氣如何,問題依然存在OpenGL或Metal被用作渲染API。

我們如何解決或至少調試此問題?

+0

這些生活,活躍的場景與不斷變化的元素?如果沒有任何動作,您將看到SceneKit的極端優化,以節省電量。它不會以60 FPS旋轉來重新繪製靜態內容。你期望發生什麼,以及發生了什麼? –

+0

他們在不斷移動 - 我們移動全景圖,無論何時移動設備(通過CoreMotion)。 我們希望它可以以30-60 fps的速度平滑運行,但幀頻下降非常低,UI滯後很多。 – Emiswelt

回答

1

你可以嘗試使用子節點而不是附加的SCNViews嗎?

+1

這絕對是正確的方法 - 一次有多個OpenGL或Metal視圖動畫是一個災難性的表現。使用一個視圖並在其中繪製多個事物。 –

+1

你會如何與UICollectionViewCells結合使用? – schickling

+0

問題正是UICollectionView。 使用UICollectionView需要有一堆不同的UI元素。我認爲沒有辦法爲幾個UI元素使用相同的GLContext和渲染線程? – Emiswelt

1

而不是UICollectionView,如何使用SpriteKit場景?

SpriteKit場景平鋪了方形/矩形SK3DNode實例的集合。每個節點都有一個全景圖,使用SceneKit場景進行渲染,就像你現在使用UICV單元一樣。

+2

這將具有將所有渲染組合到相同GL /金屬上下文中的優勢。不過,你會失去'UICollectionView'的2D佈局特性。也許一個有趣的(但繁瑣的)混合方法是使用不可見元素的'UICollectionView'來處理佈局,'SKView'包含'SK3DNode'來處理渲染 - 在那裏你手動同步不可見的集合視圖元素的幀與SpriteKit元素負責渲染。 – rickster