2017-11-08 17 views
0

私は正しい質問が何であるか正確にはわからないので、事前に謝罪してください。私は最終的にはアドレスにしようとしている問題は、次のとおりです。簡単なSpriteKitのゲームのパフォーマンスの問題 - Swift

1)ゲームは

2)CPU%は時間で50から60パーセントと同じくらい、高く得ることができた時間にラグを取得するだけでなく、時には比較的です低(< 20%)

3)デバイス(iPhone 6S)少し暖かい

を得ることができます私はlagginessを駆動しているものと信じて、私は常に作成し、SKSceneで円を削除するよということです。サークルはゲームにとって非常に重要な要素であり、サイズや物理を常に変更しなければならないので、やむを得ないことです.Bodyプロパティは、ノードを再利用するという点ではあまりできません。また、私は別のノードをほぼ常に動かしています。

func addCircle() { 

    let attributes = getTargetAttributes() //sets size, position, and color of the circle 


    let target = /*SKShapeNode()*/SKShapeNode(circleOfRadius: attributes.size.width) 
    let outerPathRect = CGRect(x: 0, y: 0, width: attributes.size.width * 2, height: attributes.size.width * 2) 

    target.position = attributes.position 
    target.fillColor = attributes.color 
    target.strokeColor = attributes.stroke 
    target.lineWidth = 8 * attributes.size.width/35 
    target.physicsBody = SKPhysicsBody(circleOfRadius: attributes.size.width) 

    addStandardProperties(node: target, name: "circle", z: 5, contactTest: ContactCategory, category: CircleCategory) //Sets physicsBody properties 

    addChild(target) 


} 

getAttributes()関数のコストはあまり高くありません。円の位置を設定するwhileループはありますが、関数が呼び出されたときに通常は使用されません。そうでなければ、簡単な数学です。

その他の詳細:

1)このアプリケーションは一定の120 fpsで動作します。私はGameScene.swiftにview.preferredFramesPerSecond = 60とGameViewControllerにgameScene.preferredFramesPerSecond = 60を追加して、シーン/ビューを低く設定しようとしました。これらのいずれもfpsを変更するものではありません。通常、他のアプリでパフォーマンスの問題が発生した場合、fpsは低下しましたが、ここでは発生していません。

2)SKShapeNodeイニシャライザを切り替えて、circleOfRadiusとパスを使い、パスをリセットしようとしました。しかし、私は物理学をリセットしなければならないので、イメージを試しました.Body、パフォーマンスが向上するとは思われません。

3)私は物理スピードを変えようとしましたが、世界のスピードはこれもほとんど効果がありませんでした。

4)私はまた、問題を特定するためにInstrumentsを使用しました。 SKRendererが使用しているリソースの大きなチャンクがありますが、私はこれに関する多くの情報を見つけることができません。

+0

SKShapeNodesは非効率的で、控えめに使用する必要があります。私は1つのサークルを作成し、ちょうどそれをスケールすることをお勧めします – Knight0fDragon

答えて

2

SKShapeNodesを作成することは効率的ではありません。できるだけ使用しないでください。代わりにテンプレートシェイプを作成し、SKSpriteNodeに変換します。

あなたが変更、あなたは色を変更する必要がある場合、あなたは様々な色のストロークを持っている必要がある場合は1

colorBlendFactorcolorを使用し、その後、xScaleyScaleを使用し、サイズを変更する必要がある場合2 SKSpriteNodes、塗りつぶしのみを処理する1 SKSpriteNode、およびストロークのみを処理する1 を持つようにします。ストロークスプライトをzPosition0で塗りつぶしスプライトの子にし、ストロークカラーを白に設定します。円の子ノードにcolorcolorBlendFactorを適用して色を変更することができます。

lazy var circle = 
{ 
    let target = SKShapeNode(circleOfRadius: 1000) 
    target.fillColor = .white 
    //target.strokeColor = .black //if stroke is anything other than black, you may need to do 2 SKSpriteNodes that layer each other 
    target.lineWidth = 8 * 1000/35 

    let texture = SKView().texture(from:target) 
    let spr = SKSpriteNode(texture:texture) 
    spr.physicsBody = SKPhysicsBody(circleOfRadius: 1000) 
    addStandardProperties(node: spr, name: "circle", z: 5, contactTest:ContactCategory, category: CircleCategory) //Sets physicsBody properties 
    return spr 
}() 

func createCircle(of radius:CGFloat,color:UIColor) -> SKSpriteNode 
{ 
    let spr = circle.copy() 
    let scale = radius/1000.0 
    spr.xScale = scale 
    spr.yScale = scale 
    spr.color = color 
    spr.colorBlendFactor = 1.0 
    return spr 

} 

func addCircle() { 

    let attributes = getTargetAttributes() //sets size, position, and color of the circle 
    let spr = createCircle(of:attribute.width,color:attributes.color) 
    spr.position = attributes.position 
    addChild(str) 
} 
+0

完全な開示で、私はこの正確な解決策を試していませんが、私はすでに持っているコードのために、1)xScaleとyScaleを同じSKShapeNodeSKShapeNodesの代わりにSKSpriteNodesを使用するが、そのたびにテクスチャ画像(すなわち、色)を置き換えることができる。複数のノードを作成しないと助けになりましたが、CPU使用率はまだ30-50%(おそらく10%の改善)です。実際には、シーンが設定された直後、何かが動き始めたりリアルタイムに追加される前に、CPU使用率はかなり高いです。見るべき他の明白なエリアはありますか? – SuperCodeBrah

+0

また、デバッグナビゲータに 'showsFPS = true'を追加するとSKViewに60FPSが表示されますが、120FPSが表示されます。そこに問題はありますか?最後に、アプリを開いて最初のView Controllerに行ったとき、何もしていなければCPU使用率は0%になります。私はGameViewControllerに踏み込んだ後、急上昇しますが、最初のView Controllerに戻った場合、CPU使用率は0%に戻りませんが、約12-15%になります。これは何を示しているでしょうか? – SuperCodeBrah

+0

いいえ、あなたが120FPSを見ている理由はわかりません最新のiPadのみが私が考えていたものをサポートしています – Knight0fDragon

関連する問題