6

同じものを 1000 回表示したいのですSCNGeometryが、特定のアニメーション (回転、移動などの SCNActions など) と拡散マテリアルとして別の画像を使用します。

ドキュメントと素晴らしい WWDC プレゼンテーションを確認した後、1 つのノードを作成するための最良の方法を見つけました (つまり、1000 回呼び出されます)。

//self is a SCNNode
//helper.getStar3D() is a SCNNode template which has been flattened
//the geometry is light (36 triangles according to scenekit statistic)

//need to copy the geometry and material so it is not shared by all nodes 
self.geometry=helper.getStar3D().geometry.copy() as SCNGeometry
self.geometry.firstMaterial = helper.getStar3D().geometry.firstMaterial.copy() as SCNMaterial

// texture has been extracted from a SKTextureAtlas 
self.geometry.firstMaterial.diffuse.contents=allTextures.firstObject as SKTexture

ただし、iPad Air では 40 fps にしか達しません (また、 firstMaterial.diffuse.contents を更新するブロックを使用して SCNAction を介してテクスチャをアニメーション化する場合は 27 fps に達します)。

私は、SKTextureAtlas を使用して (すべての画像が同じテクスチャ上にあるように)、同じジオメトリを使用すると考えました (明らかに、ジオメトリをコピーすると、データが共有されます - Build a Game with sceneKit を参照)。 OpenGL の最適化を許可します。SceneKit の多くのパラメーターで遊んでみましたが、成功しませんでした。

注意: SceneKit 統計は、1000 の描画呼び出しがあることを示しており、Xcode のグラフィック統計は、CPU 18 ミリ秒、GPU 22 ミリ秒、タイラー 18%、レンダラー 80%、デバイス 88% です (新しい SceneKit 統計が待ちきれません)。 Xcode のモジュール!)

私の質問は次のとおりです。それは通常のパフォーマンスだと思いますか、それとも SceneKit でやりたいことを最適化する方法はありますか? ありがとう!

編集:実際には SKTextureAtlas はレンダリングを最適化していないようですが、フレームレートを低下させているようです。SKTextureAtlas から取得した SKTexture の代わりに UIImage を使用すると、25% の改善 (50fps) が得られます。SKTextureAtlas または UIImages を使用してテクスチャをアニメーション化する (各オブジェクトのテクスチャを 0.2 秒ごとに更新する) と、実際にはパフォーマンス (20fps) が低下します。SKTextureAtlas は通常最適化に使用されるため、ここで何かが欠けていると思います。

4

0 に答える 0