Sprite 套件精灵加载性能改进
Posted
技术标签:
【中文标题】Sprite 套件精灵加载性能改进【英文标题】:Sprite kit sprites loading performance improvement 【发布时间】:2015-05-24 20:53:46 【问题描述】:我正在制作一个精灵套件游戏,我正在使用 plist 文件来设置每个级别的属性。我的 plist 文件中的一个属性是一个名为 patterns 的字典,其中包含 n 个项目,其中每个项目都是一个块,手动键入 x 和 y 位置。这个模型非常适合我正在制作的游戏,因为快速设置关卡非常方便。但是,由于缺乏编码经验,我面临一个我无法解决的缺点:一些关卡有多达 290 个块,所以当应用程序尝试读取关卡时,应用程序会冻结 5 秒。这对用户来说非常烦人。一开始我的方法是:读取 plist 文件,并为每个项目调用方法,该方法使用其 imageNamed "" 方法将块创建为 SKSpriteNode。我认为这是它滞后这么多的原因,我试图在运行时加载 300 个精灵这一事实似乎是问题的一个有希望的原因。然后我尝试了以下方法:当游戏第一次开始时,我制作了最初加载块池的方法。这是我的方法
func addObsticles1ToPool()
for i in 0...300
let element = SKSpriteNode(imageNamed: "obsticle1")
element.hidden = true
obsticle1Pool.append(element)
然后,我的代码读取 plist 文件,并为每个块调用以下内容:
func block(x: CGFloat, y: CGFloat, movingUp: Bool, movingSide: Bool, spin: Bool, type: Int16)
var block: SKSpriteNode!
for obs in obsticle1Pool
if obs.hidden
block = obs
break
block.hidden = false
// Further down the properties of the block are set, such as actions it should perform depending on the input values, also its physics body is set.
我还有一些方法可以处理这样一个事实,即新元素应该作为游戏的收益添加到池中,所有这些都可以正常工作。延迟时间下降到 3.5 - 4 秒左右,但这显然还不够好。我想要一个没有延迟的游戏。但是,我不确定是否有另一种更有效的方法来做我想做的事情,而不是使用精灵池。 有谁知道如何减少这个延迟时间?
【问题讨论】:
添加加载画面? 简单的解决方案,但这不在我的 UI 设计要求中:/ 你预加载了你所有的图片吗? U 将耗尽所有系统 RAM,尝试在开始时加载 300 个图像。操作系统将在具有这种使用模式的真实手机上杀死您的应用程序。此外,还有一个启动计时器,可以查看您的应用程序启动多长时间,如果启动时间过长,它将被终止。总体而言,您需要一种更好的方法,以便不需要加载太多图像或不那么大的尺寸。 【参考方案1】:我也遇到了同样的问题!问题出在这一行...
let element = SKSpriteNode(imageNamed: "obsticle1")
SpriteKit 不够聪明,无法知道已经使用该图像创建了纹理。所以它所做的就是一遍又一遍地创造那种纹理,这很昂贵。
而是先在循环外创建纹理,然后使用纹理创建精灵节点。像这样的...
let elementTexture = SKTexture(imageNamed: "objstical1")
for i in 0...300
let element = SKSpriteNode(texture: elementTexture)
element.hidden = true
obsticle1Pool.append(element)
这不仅会快很多,而且会减少您的应用程序内存...假设这与我遇到的问题相同。希望这会有所帮助。
【讨论】:
谢谢,确实有帮助!以上是关于Sprite 套件精灵加载性能改进的主要内容,如果未能解决你的问题,请参考以下文章