我正在使用SpriteKit在
Swift中为我的iOS应用程序创建一个随机项目微调器,但是目前我的方法效率不高,我几乎可以肯定它不是实现我的目标的最好方法.我目前遵循的过程基本上是.
– 在场景加载时,循环显示13个不同项目的列表(存储在JSON中)
– 创建一组显示相关数据的节点
– 将每组节点添加到第二组节点,稍微沿x轴移动每个节点,创建一长串SKNode(旋转器的项目)
– 沿x轴移动该组,以给人一种旋转物品的印象
但是这个方法需要大约6秒才能加载场景(并且延迟是将节点添加到更大的节点:group.addChild(spinnerItem),因为我只是Swift的新手,我相信我有更好的方法这样做,所以任何帮助/建议都会欣赏改进此代码,因为它需要提高效率!
这是didMove函数……
override func didMove(to view: SKView) {
var xPos = CGFloat(self.frame.width + 150)
var eventWeapon = weapon()
for n in 0...13{
eventWeapon = getWeapon(caseName: "chromaCase", weaponID: n)
print(eventWeapon)
let texture = createSpinnerItem(wName: "\(eventWeapon.name)", wSkin: "\(eventWeapon.skin)", wColor: "\(eventWeapon.color)")
let spinnerItem = SKSpriteNode(texture: texture)
spinnerItem.position = CGPoint(x: xPos, y: self.frame.height / 2)
group.addChild(spinnerItem)
xPos = xPos + 300 * 1.2
}
self.addChild(group)
group.run(SKAction.moveBy(x: -5000, y: 0, duration: 2))
}
以及在…中使用的createSpinnerItem函数
func createSpinnerItem(wName: String, wSkin: String, wColor: String) -> SKTexture {
let object = SKNode()
let bGround = SKShapeNode(rectOf: CGSize(width: 300, height: 300))
bGround.fillColor = color.offWhite
bGround.strokeColor = color.gray
bGround.lineWidth = 5
object.addChild(bGround)
let titleBG = SKShapeNode(rectOf: CGSize(width: 300, height: 100))
if wColor == "blue"{ titleBG.fillColor = color.CSGOblue }
if wColor == "red"{ titleBG.fillColor = color.CSGOred }
if wColor == "pink"{ titleBG.fillColor = color.CSGOpink }
if wColor == "purple"{ titleBG.fillColor = color.CSGOpurple }
titleBG.strokeColor = color.gray
titleBG.lineWidth = 5
titleBG.position = CGPoint(x: 0, y: -150 + 50)
object.addChild(titleBG)
let weaponName = SKLabelNode()
weaponName.text = wName
weaponName.fontColor = color.white
weaponName.fontSize = 40
weaponName.fontName = "Avenir-Regular"
weaponName.verticalAlignmentMode = .center
weaponName.position = CGPoint(x: 0, y: -150 + 70)
object.addChild(weaponName)
let weaponSkin = SKLabelNode()
weaponSkin.text = wSkin
weaponSkin.fontColor = color.white
weaponSkin.fontSize = 20
weaponSkin.fontName = "Avenir-Regular"
weaponSkin.verticalAlignmentMode = .center
weaponSkin.position = CGPoint(x: 0, y: -150 + 30)
object.addChild(weaponSkin)
return object
}
最佳答案 您要做的第一件事就是确定您的“感知”延迟是否真实,而不仅仅是启动应用程序的开销. 6秒是很长一段时间,所以没有测量,你不知道你是在夸大还是理解真正的延迟.我会通过几个人的意识来理解我的意思.你应该像KnightOfDragon建议并实际测量时间一样.
我现在确实看到了代码的一个问题,并且我在人们使用SK on SO的代码中看到的情况并不少见.这进入了上面提到的感知概念.处理工作所需的实际CPU使用率可能不会很大,但是您在运行时遇到的可能与实际预期的CPU负载不匹配.为什么?你可能在主线程上做了很多工作.从加载JSON到可能创建纹理.因此,你会发现通过使主线程挨饿,你可以看到你不会看到的减速.广义问题,应用程序或游戏,我看到许多人尝试并在字面上加载他们的didMove或app viewDidLoad中的所有内容.你真正想要做的就是把它当作引导起点.做最少量的工作来设置,然后使用你喜欢的方法异步调度耗时的东西.当你执行文件I / O之类的操作时,这将减轻你锁定主线程的麻烦.
是的,这确实使您的代码复杂化以便能够处理这个问题,但这种方法并非不典型.大多数引擎都有加载系统来帮助在后台加载项目并在完成后通知.在发生加载时,您通常会看到加载屏幕或其他指示.
请记住,当您修改SKNode层次结构时,您需要确保在正确的线程上执行此操作(例如,当您将addChild添加到活动场景时).您可以通过SKAction或主线程来完成.否则你的应用会崩溃.