我正在使用 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 的建议去做,并实际测量时间。
我现在确实看到代码存在一个问题,而且我在 SO 上使用 SK 的人的代码中看到的情况并不少见。这进入了上面提到的感知概念。处理您的工作所需的实际 CPU 使用率可能并不大,但是您在运行时遇到的情况可能与实际预期的 CPU 负载不匹配。为什么?您可能在主线程上做了很多工作。从加载 JSON 到可能创建纹理。因此,您会发现通过使主线程处于饥饿状态,您会看到其他方式看不到的速度变慢。普遍存在的问题,无论是应用程序还是游戏,我看到很多人尝试并从字面上加载他们的 didMove 中的所有内容,或者如果是应用程序 viewDidLoad。您真正想要做的是将其更像是一个引导起点。在那里做最少的设置工作,然后使用您喜欢的方法异步分派(dispatch)耗时的东西。这将减轻您在执行文件 I/O 等操作时锁定主线程的情况。
是的,为了能够处理这个问题,这确实会使您的代码变得有点复杂,但这种方法并非非典型。大多数引擎都有加载系统来帮助在后台加载项目并在完成时发出通知。在加载过程中,您通常会看到加载屏幕或其他一些指示器。
请记住,当您修改 SKNode 层次结构时,您需要确保在正确的线程上进行(例如,当您将 addChild 添加到事件场景)。您可以通过 SKAction 或在主线程上执行此操作。否则您的应用可能会崩溃。
关于ios - 为什么创建大量 SKNode 需要这么长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40449535/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在