我希望能够通过某种方式提高我的游戏性能"展平"我的背景节点。
This youtube video demonstrates how I build up my background graphics.
但是,我的背景图形设置如下。
我使用两个纹理,如邮票,然后重复。 在这种情况下......一个山顶纹理与雪顶... 没有雪的一个山纹理。 我改变了这些邮票的zPosition,用于"分层"影响。
然后我使用"填充"它们只是纯灰色的SKSpriteNodes,可以覆盖需要灰色填充的部分。
E.g。在添加填充节点之前
然后在顶部添加带有alpha的彩色屏幕,使山体看起来褪色。
游戏有时冻结......但是当我删除这些图形时它并没有冻结。
有没有办法通过在场景加载时基于zPosition合并或展平我的背景图形节点来提高性能? 我该怎么做?
这会改善表现吗? 或者在我的案例中提高绩效的最佳方法是什么?
我认为这个问题类似...... Merge all SKSpriteNode children into a single SKSpriteNode
但是,我如何在Swift中执行此操作并将zPosition和alpha考虑在内,这样我就不会失去分层效果?
答案 0 :(得分:5)
您可能想要做的事情:
将前景和背景分成单独的SKS文件,然后加载它们
通过SKReferenceNode
使用SKReferenceNode
view!.texture(from: node)
s
确保您的地图集没有以增加抽奖计数的方式分解
设计代码的方式不是所有节点都在场景中,节点越多,代码就越慢。
如果您有SKPhysicsBody
,请尝试尽可能少地使用。这可以通过将多个实体与SKPhysicBody(bodies:)
合并在一起或创建一个带有多边形的多边形体来完成。
此外,如果您的身体没有通过物理移动(不是SKAction
s),请确保isDynamic
设置为false
如果您正在运行SKAction
,请确保尽可能少地使用这些内容。例如,如果有4个不同的节点以每秒10点的速度向左移动,则可以将这4个节点放入父节点,并在父节点上运行该操作。
答案 1 :(得分:4)
好的,所以这里有一个你现在拥有的例子..你的所有节点都是这样的:
如何轻松地执行bitblit是将所有这些移动到名为" background"
的新空节点下现在转到swift文件,为我们将在代码中创建的新节点设置占位符变量
class GameScene: SKScene {
var blitBackground = SKSpriteNode()
override func didMove(to view: SKView) {
}
}
现在,添加这个方便的功能,如果需要,可以在所有项目中使用:
func blit(from node: SKNode) -> SKSpriteNode {
return SKSpriteNode(texture: SKView().texture(from: node))
}
以下是我们用来初始化bitblit背景的方法,并从游戏中删除迟到的方法:
func blitTheBackground() { // use in didMove
let laggyBackground = childNode(withName: "background")!
blitBackground = blit(from: laggyBackground)
laggyBackground.removeFromParent()
addChild(blitBackground)
}
这是完成的场景:
class GameScene: SKScene {
var blitBackground = SKSpriteNode()
func blit(from node: SKNode) -> SKSpriteNode {
return SKSpriteNode(texture: SKView().texture(from: node))
}
func blitTheBackground() {
let laggyBackground = childNode(withName: "background")!
blitBackground = blit(from: laggyBackground)
laggyBackground.removeFromParent()
addChild(blitBackground)
}
override func didMove(to view: SKView) {
blitTheBackground()
}
}
它将节点数量从10减少到4 ...希望对你来说它也有助于你的抽奖计数!!
如果需要在循环中执行此操作,请确保将其放在自动释放池中以确保在使用后释放内存。从视图创建纹理会占用大量内存,因此如果您不小心,可能会出现错误。
for i in 0..<5
{
autoreleasepool{
let laggyBackground = childNode(withName: "background\(i)")!
blitBackground = blit(from: laggyBackground)
laggyBackground.removeFromParent()
addChild(blitBackground)
}
}