2016-01-24 58 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