gpt4 book ai didi

swift ,SpriteKit : Low FPS with a huge for-loop in update method

转载 作者:行者123 更新时间:2023-12-04 08:55:36 26 4
gpt4 key购买 nike

使用下面的代码使用 Sprite Kit 的 FPS 非常低(~7fps 到 ~10fps)是否正常?
用例:
我只是从下到上画线(1024 * 64 线)。我有一些 delta 值来确定每一帧的单条线的位置。这些线代表我的 CGPath ,分配给 SKShapeNode每一帧。没有其他的。我想知道 SpriteKit(或者可能是 Swift)的性能。
你有什么建议来提高性能吗?
屏幕:
screenshot
代码:

import UIKit
import SpriteKit

class SKViewController: UIViewController {

@IBOutlet weak var skView: SKView!

var scene: SKScene!
var lines: SKShapeNode!

let N: Int = 1024 * 64
var delta: Int = 0

override func viewDidLoad() {
super.viewDidLoad()

scene = SKScene(size: skView.bounds.size)
scene.delegate = self

skView.showsFPS = true
skView.showsDrawCount = true
skView.presentScene(scene)

lines = SKShapeNode()
lines.lineWidth = 1
lines.strokeColor = .white

scene.addChild(lines)
}
}

extension SKViewController: SKSceneDelegate {
func update(_ currentTime: TimeInterval, for scene: SKScene) {
let w: CGFloat = scene.size.width
let offset: CGFloat = w / CGFloat(N)

let path = UIBezierPath()

for i in 0 ..< N { // N -> 1024 * 64 -> 65536
let x1: CGFloat = CGFloat(i) * offset
let x2: CGFloat = x1
let y1: CGFloat = 0
let y2: CGFloat = CGFloat(delta)

path.move(to: CGPoint(x: x1, y: y1))
path.addLine(to: CGPoint(x: x2, y: y2))
}

lines.path = path.cgPath

// Updating delta to simulate the changes
//
if delta > 100 {
delta = 0
}
delta += 1
}
}

谢谢和最好的问候,
相叶^_^

最佳答案

中央处理器
65536 是一个相当大的数字。告诉 CPU 理解这么多循环总是会导致缓慢。例如,即使我制作了一个仅测量运行空循环所需时间的测试命令行项目:

while true {
let date = Date().timeIntervalSince1970


for _ in 1...65536 {}

let date2 = Date().timeIntervalSince1970
print(1 / (date2 - date))
}
这将导致 ~17 fps。我什至还没有应用 CGPath,它已经很慢了。

调度队列
如果你想让你的游戏保持 60fps,但你的 CGPath 渲染可能仍然很慢,你可以使用 DispatchQueue .
var rendering: Bool = false // remember to make this one an instance value

while true {
let date = Date().timeIntervalSince1970

if !rendering {
rendering = true
let foo = DispatchQueue(label: "Run The Loop")
foo.async {
for _ in 1...65536 {}
let date2 = Date().timeIntervalSince1970
print("Render", 1 / (date2 - date))
}
rendering = false
}
}
这保留了自然的 60fps 体验,您可以更新其他对象,但是,您的 SKShapeNode 对象的渲染仍然很慢。

图形处理器
如果您想加快渲染速度,我建议您考虑在 GPU 而不是 CPU 上运行它。 GPU(图形处理单元)更适合于此,并且可以在不干扰游戏玩法的情况下处理巨大的循环。这可能需要您将其编程为 SKShader,其中有教程。

关于 swift ,SpriteKit : Low FPS with a huge for-loop in update method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63847138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com