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の
私は 'SCNLevelOfDetail'を見ていきます。 'preferredFramesPerSecond'変数は> macOS 10.12でしか利用できませんが、そこには良い効果があります。新しい発見はレンダリングループが "Metal Flush"のほとんどの時間を費やすことです。 –
私はシーンからカメラの距離を移動させません(まだ)ので、SCNLevelOfDetailは現在役に立ちません。 –
試しましたか?ほとんどの場合、ピクセルを持つよりも多くの頂点をシーンに入れているので、(LODを使って)その数を減らすと、レンダリングしているものの量が減ります。 –