【发布时间】:2016-09-16 02:57:58
【问题描述】:
我正在使用 Swift 和 SpriteKit 构建我的第一款游戏,最近我将整个游戏拆开以确定我的 CPU 问题来自哪里(在玩游戏的几分钟内,大约 80-100%)。我最近发现最昂贵的操作之一位于touchesMoved 方法中。这并不奇怪,因为它被非常频繁地调用,并且用户在整个游戏中都用手指来控制主角。但是,我惊讶地发现,特别是一条线路造成了麻烦。这是我的代码:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch : AnyObject in touches {
let location = touch.location(in: self)
let touchStartPoint:CGPoint = startingTouches[touch as! UITouch]!
if(controlBase.frame.contains(touchStartPoint)){
controlStick.position = location
}
}
}
我用 Instruments 运行了 4 个单独的测试,每个测试都用另一行。我发现没有
if(controlBase.frame.contains(touchStartPoint)){
controlStick.position = location
}
当我的手指向下时,我在大约 5-10% 的 CPU 上徘徊 - 所以 touchesMoved 仍然被调用。但是,在检查if(controlBase.frame.contains(touchStartPoint)){ 时,即使括号内没有任何内容,我也会达到约 20-30% 的 CPU。
这是我的 Instruments 日志的图片:最低点是我的手指从屏幕上抬起时,最高点是我的手指移动控制器时。
有没有办法解决这个问题?我正在做这个检查以确保用户虚拟操纵杆上的手柄不能离开它的底座。我只是不确定为什么这条线会如此昂贵,如果这是此检查所固有的,是否有另一种方法可以实现类似的功能。谢谢!
【问题讨论】:
-
我不确定我是否会担心这个。根据您的仪器日志,您没有使用大量 CPU。你会注意到渲染是你的最高消费者,而不是你的触摸代码。除非您需要向下滚动更多才能显示它。尝试在下次运行时使用 Xcode 中的 CPU 仪表板,看看这些数字的表现如何。还有你的 FPS 是多少?
-
真的吗?我相信在 Xcode 上,他们建议 20%,除非你说如果 FPS 没有受到严重影响,就没有太多可担心的?我的 FPS 稳定在 60 直到游戏后期(几分钟),当它降级到低 40 秒时——这个例子也没有考虑完整的游戏玩法,只考虑了控制器(这是一个单独的项目,我正在重建应用程序)
-
现在尝试运行 Spaceships 并查看它的 CPU 使用率(减去几分钟后)。如果你的触摸代码消耗了很多,你会看到它出现在调用树中更高的位置,但事实并非如此。我会说在你的其他东西上取得进展并重新审视。让 FPS 成为您的向导。最后你很可能会得到一个高 CPU 使用率的游戏,除非你正在制作像井字游戏这样的东西;)。显然,下降表明您还有其他挑战。
-
哦,是的,拥有一些可以从树上下来并给出准确计数的东西可能仍然有用,以防万一您需要计数。这样的代码就派上用场了。
-
这就是当非游戏引擎公司(例如:Apple)在制作游戏引擎方面有所努力时发生的情况。 ://
标签: swift sprite-kit