- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 SpriteKit 和 Swift 编写游戏,遇到了内存问题。
我的游戏布局是这样的,即 GameViewController (UIViewController) 在 viewDidLoad 屏幕中呈现第一个 SKScene (levelChooserScene)。这个场景只是显示一堆按钮。当用户选择一个按钮时,场景然后使用 skView.presentScene 转换到正确的场景,当关卡完成时,该场景然后转换回 levelChooserScene 并且游戏准备好供用户选择下一个级别。
问题是当转换回 levelChooserScene 时,分配给游戏场景的内存没有被释放,所以在只选择了几个级别后我开始收到内存错误。
我的设计在从 SKScene 过渡到 SKScene 时是否正确,或者我应该每次都返回 GameViewController,然后从那里过渡到下一个 SKScene?
我在这里发现一些帖子说我应该在场景之间调用 skView.presentScene(nil),但我对如何或在哪里实现它感到困惑。
我只是想从一个 SKScene 过渡到另一个,并将传出场景中使用的内存返回给系统。
这是我如何实现 SKScene 的示例:
class Level3: SKScene
{
var explodingRockTimer = NSTimer()
var blowingUpTheRocks = SKAction()
override func didMoveToView(view: SKView)
{
NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "dismissTheScene:", userInfo: nil, repeats: false)
var wait = SKAction.waitForDuration(0.5)
var run = SKAction.runBlock{
// your code here ...
self.explodeSomeRocks()
}
let runIt = SKAction.sequence([wait,run])
self.runAction(SKAction.repeatActionForever(runIt), withKey: "blowingUpRocks")
var dismissalWait = SKAction.waitForDuration(5.0)
var dismissalRun = SKAction.runBlock{
self.removeActionForKey("blowingUpRocks")
self.dismissTheScene()
}
self.runAction(SKAction.sequence([dismissalWait,dismissalRun]))
}
func explodeSomeRocks()
{
println("Timer fired")
}
//MARK: - Dismiss back to the level selector
func dismissTheScene()
{
let skView = self.view as SKView?
var nextScene = SKScene()
nextScene = LevelChooserScene()
nextScene.size = skView!.bounds.size
nextScene.scaleMode = .AspectFill
var sceneTransition = SKTransition.fadeWithColor(UIColor.blackColor(), duration: 1.5) //WithDuration(2.0)
//var sceneTransition = SKTransition.pushWithDirection(SKTransitionDirection.Down, duration: 0.75) //WithDuration(2.0)
//var sceneTransition = SKTransition.crossFadeWithDuration(1.0)
//var sceneTransition = SKTransition.doorwayWithDuration(1.0)
sceneTransition.pausesOutgoingScene = true
skView!.presentScene(nextScene, transition: sceneTransition)
}
}
最佳答案
导致我麻烦的事情是使用 SKAction.repeatActionForever() 调用发射器插入函数,每半秒插入一次粒子发射器,持续 5 秒。
这个 repeatAction 显然并没有因为转换到另一个场景而被杀死,而是导致整个场景的内存被保留。我改用 SKAction.repeatAction() 并指定它应该触发多少次。当我转换到新场景时,场景现在会返回所有内存。
不过我不确定我是否理解这种行为。
关于swift - SpriteKit 场景转换良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29734729/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!