SpriteKit 丢失纹理

Posted

技术标签:

【中文标题】SpriteKit 丢失纹理【英文标题】:SpriteKit loses textures 【发布时间】:2014-03-22 11:25:42 【问题描述】:

我正在制作基于SpriteKit 的多层次游戏。

一切都很好,除了一件事:当用户玩了很长时间,改变了很多关卡等等......然后SpriteKit开始丢失纹理。

我的意思是没有像图像加载失败时那样的大红十字,而是像什么都没有一样的空白空间。

数小时的调试和谷歌搜索没有产生任何结果。

我该如何处理这个错误?

【问题讨论】:

第一件事:检查内存使用情况和对象生命周期/使用 Instruments 泄漏。也许您只是由于内存中的泄漏或某些对象引用(可能是不必要的)而耗尽了内存。 学习Cocos2D,我做到了。完全没有泄漏。但我注意到一种奇怪的行为——我的自定义 SKScene 有时即使没有引用它也不会发布。检查了 10 次,引用计数为 0,但场景仍在内存中。 您使用的是 SKTextureAtlas 吗?如果是这样,为了进行测试,请尝试将图像从 .atlas 目录移到一个普通目录中。有报道称 SKTextureAltas 自 ios8 Beta4 起已损坏。 嗨,我知道这是一个旧线程,但最后你找到解决问题的方法了吗?遇到同样的问题。 【参考方案1】:

我认为我可能遇到了相关问题,除了在 SKSpriteNode 上快速运行动作时会发生纹理丢失。在我的代码中,每次触摸时我都会运行一个动作,当触摸快速且动画快速触发时,SKSpriteNode 的基本纹理似乎消失了。没有内存警告,没有来自控制台的窥视; SKSpriteNode 的纹理被神奇地设置为 nil。

我从你的问题中得到的印象是这不是你的确切原因,但你有同样的症状。不幸的是,我不知道是什么原因造成的。我为解决这个问题所做的工作是不断检查我的 SKSprite 节点上的纹理是否在我运行 SKAction 后立即设置为 nil,然后在需要时重新分配它。

所以,我正在做的一个精简版(在 Swift 中)看起来像这样:

func doAnimation(  ) 

    _character.runAction(someSKAction, withKey: "animation")

    //Whoops!, we lost our base texture again!
    if _character.texture == nil 
        let atlas = SKTextureAtlas(named: "someAtlasName")
        let texture = atlas.textureNamed("idleFrame" )
        _character.texture = texture
    

这并不是真正的解决方案,而是一种解决方法,但它可能会适应您的情况,直到您(或 SO 上的其他人)弄明白为止。我不会说它不丑。

顺便说一句,你不是唯一遇到纹理消失的问题;我对类似问题here写了类似的回复。

【讨论】:

我在 Obj-C 的 SpriteKit 中使用 unarchiveFromFile 编程模式,我没有纹理,但最糟糕的是,精灵在那里。当我记录这个对象时,我得到这个:背景是: name:'background' texture:['nil'] position:518.32251, 389.90796 scale:1.00, 1.00 size:0, 0 anchor: 0.5, 0.5 旋转:0.00 嗨,我知道这是一个旧线程,但最后你是否偶然找到了比上面发布的更好的替代解决方案?有同样的问题。

以上是关于SpriteKit 丢失纹理的主要内容,如果未能解决你的问题,请参考以下文章

“纹理图集不支持模板渲染”SpriteKit 和 Xcode

SpriteKit 部分纹理映射

在 SpriteKit 中预加载纹理

SpriteKit 关卡编辑器纹理图集

SpriteKit animateWithTextures 不适用于纹理图集

我必须在 SpriteKit 应用程序中包含非视网膜纹理吗?