- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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/
我有一个独立的 Thread 应用程序。这是一个等待消息的监听器,当消息到达时执行一些操作,其中我必须将消息保存在数据库中。但我遇到了问题,因为如果我运行应用程序并“手动发送消息”,一切都会正常工作,
我有以下php代码: sleep(65); $query = "UPDATE database.table SET XXXXXXX = XXXXXXX - ".$YYYYYY." WHERE
我正在开发一个业余爱好应用程序。它在主布局中使用 webview。单击 webview 内的链接会使用户保持在 webview 内。启动后一切正常,但仍在应用程序内。但是,在手机休眠一段时间后,我重新
我目前运行的应用程序需要最大堆大小为 16GB。 目前我使用以下标志来处理垃圾回收。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSIniti
$ uname -a Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011
在 while 循环仍在休眠时退出它的最简单方法是什么?是否有某种函数可以在 sleep 时检测某个值是否为真? 或者我是否在循环中设置一个小 sleep 并检查如果不再睡一会儿就退出?如果可以,我该
我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hib
当我运行长时间操作时,我遇到来自 IIS 的请求超时。我的 ASP.NET 应用程序正在后台处理数据,但处理的记录数量很大,因此操作需要很长时间。 但是,我认为 IIS 使 session 超时。这是
我不确定从哪里开始解决这个问题,但如果我有一个 AJAX 网络应用程序向服务器发送请求并在数据库(在我的例子中是 postgresql)上运行长查询,有没有办法停止或如果仍在运行时用户刷新页面或关闭
我是一名优秀的程序员,十分优秀!