我正在使用SpriteKit制作我的第一个游戏,其中敌人从一侧进入屏幕,从另一侧离开。我注意到,在游戏后期渲染不同类型的敌人时,FPS下降,CPU使用率接近100%(约为95-99%)。我使用了两个仪器调试工具,并得出以下结果:
在时间分析器工具中,我发现
我还使用了分配工具,并发现大量内存用于构建新的外星人精灵:
这在某种程度上是否可以预料,因为实例化新的精灵很昂贵(尽管我很少同时使用超过20个),我只是这样做来确保它们随机分布。
我也没有找到有关纹理大小的太多信息 - 是否有惯例可用?目前,我发现自己制作的精灵纹理相当大,然后使用setScale缩小它们,而不是在图像编辑器中进行缩小。
这些纹理和动画还在我的GameScene文件的开头被(预加载?)加载,例如:
如果有更好的预分配纹理的方法,我很想知道,关于如何评估其他问题的更多见解也将非常棒!
在时间分析器工具中,我发现
main
是appDelegate
的主体,这是问题所在。我知道这似乎很明显,但我惊讶地发现像GameScene
中的update
函数几乎不是问题所在。有没有办法深入研究这个问题?如果是我的一个函数引起了问题,我觉得评估我搞砸了哪里会更容易些。我还使用了分配工具,并发现大量内存用于构建新的外星人精灵:
![enter image description here](https://istack.dev59.com/cGIyS.webp)
这是我添加普通外星人的代码:
func addNormAlien(){
let mult = normAlienMultiplers
let alienInst = normAlien(startPos:CGPoint(x: 10,y: 10), speed: random(UInt32(10),max: UInt32(50))*mult[0])
let yStart = random(UInt32(alienInst.size.height/2), max: UInt32(size.height-alienInst.size.height))
alienInst.position = CGPoint(x:size.width+alienInst.size.width/2, y:CGFloat(yStart))
addChild(alienInst)
totalNodes+=1
}
这在某种程度上是否可以预料,因为实例化新的精灵很昂贵(尽管我很少同时使用超过20个),我只是这样做来确保它们随机分布。
我也没有找到有关纹理大小的太多信息 - 是否有惯例可用?目前,我发现自己制作的精灵纹理相当大,然后使用setScale缩小它们,而不是在图像编辑器中进行缩小。
这些纹理和动画还在我的GameScene文件的开头被(预加载?)加载,例如:
let laserTexture = SKTextureAtlas(named:"Sprites").textureNamed("laserTexture")`
并且
let shipFrames = ["ship0","ship1","ship2","ship3","ship4","ship5","ship6","ship7","ship8","ship9","ship9","ship9","ship8","ship7","ship6","ship5","ship4","ship3","ship2","ship1","ship0"].map{textureAtlas.textureNamed($0)}`
在这行代码之前:class GameScene: SKScene, SKPhysicsContactDelegate {
因此,我的精灵类使用类似下面的代码来访问它们:
super.init(texture: shipStartTexture, color: UIColor.clearColor(), size: shipStartTexture.size())
并且
func animateShip1() {
let animate = SKAction.animateWithTextures(shipFrames, timePerFrame: 0.1)
let forever = SKAction.repeatActionForever(animate)
self.runAction(forever)
}
如果有更好的预分配纹理的方法,我很想知道,关于如何评估其他问题的更多见解也将非常棒!
runAction
是纹理精灵的动画。我也想知道如何创建那个“池”的现有对象?那时我是否能够给它们不同的坐标/速度?或者我会在构建它们后分配这些属性?而且,在运行一些基本动画的同时进行预加载的方法是否存在?在游戏开始之前加载精灵时,一切都会卡住,并且淡入到GameScene
的动画不会运行。 - muZeroaddNormAlien
每 1-2 秒钟调用一次,这已经运行了约 5 分钟。 - muZero