2017-03-14 2 views
0

SceneKitはレンダリングデリゲートを1秒間に60回呼び出して、アニメーションや物理などを提供するために、ホストアプリケーションが含まれるシーンのパラメータを調整できるようにします。SceneKitレンダリングデリゲートでCPUの労力を節約する方法はありますか?

シーンが大きい(360,000頂点)。シーンのほぼすべて(〜95%)が1分ごとにわずかに回転します(3,600の代理コールごとに)。シーンの残りの部分(約300ノード〜15,000頂点)が1秒に1回(60人のデリゲートコールごとに)移動します。すべてのノードが作成され、そのプロパティがアプリケーションの開始前に設定され(viewDidLoad)、上で説明したように、代理人呼び出しでその位置のみが変更されます。

Xcodeによれば、フレームのリフレッシュレートは60 fpsで、CPU使用率は約30%です。私は2つの質問があります:

1)私のアプリのこの一般的な説明を考えれば、30%のCPUは妥当と思われますか?具体的には、私のデリゲートコードはシンプルで、レンダリングループの2%である<から呼び出されているので、実際には限界までSceneKitを動かすことができますか?

2)もしそうなら、いくつかのCPUをクローキングするためのSceneKitトリックはありますか?デリゲートコールレートは、たとえば低下させることができますか?あなたのジオメトリのためSCNLevelOfDetailオブジェクトの作成

これは、2.8GHzの/ i7の上のMacOS 10.12.3とXcode 8(スウィフト3)である2015 MacBook Proの

答えて

1

は試してみる価値はあります。

他に何か動いていますか?あなたのビューのpreferredFramesPerSecondを減らすことはできますか?

+0

私は 'SCNLevelOfDetail'を見ていきます。 'preferredFramesPerSecond'変数は> macOS 10.12でしか利用できませんが、そこには良い効果があります。新しい発見はレンダリングループが "Metal Flush"のほとんどの時間を費やすことです。 –

+0

私はシーンからカメラの距離を移動させません(まだ)ので、SCNLevelOfDetailは現在役に立ちません。 –

+0

試しましたか?ほとんどの場合、ピクセルを持つよりも多くの頂点をシーンに入れているので、(LODを使って)その数を減らすと、レンダリングしているものの量が減ります。 –

1

flattenedCloneを使用してノードとその子ノードを平坦化しようとします。

+0

私は実際には多くのノード(約400)を持たず、1つのノードは約350,000の頂点を持つ非常に細かい線ジオメトリです。[既にそれを平坦化したようなものです。例えば、「flattenedClone」の記述がより少ない節を示唆しているとすれば、100ノードの3500頂点に分割する方が効率的でしょうか?私はここでSceneKitをリバースエンジニアリングしているような気がする! –

関連する問題