我想通过某种方式“平平”我的背景节点来提高我的游戏的性能。
但是,我的背景图是这样设置的。
我使用两种纹理,如邮票,然后重复。在这种情况下..。一个雪顶的山体..。一座没有雪的山体。为了“分层”效果,我改变了这些邮票的zPosition。


然后,我使用“填充”,这是固体灰色的SKSpriteNodes,在需要灰色填充的部分上进行分层。
例如,在添加填充节点之前

然后在山顶上添加一个带有alpha的彩色屏幕,使山顶呈现出褪色的外观。
例如,以前

例如,之后

游戏有时会冻结..。但当我移除这些图形时,它不会冻结。
是否有一种方法可以通过合并或平整基于zPosition的背景图形节点来提高性能?我该怎么做?
这会改善业绩吗?或者,在我的情况下,提高性能的最好方法是什么?
我觉得这个问题很相似..。将所有SKSpriteNode子级合并为一个SKSpriteNode
但是,我如何在Swift中做到这一点,并将zPosition和alpha考虑在内,这样我就不会失去分层效果?
发布于 2017-10-24 23:03:42
好的,这是你现在的一个例子..这里的所有节点都是这样的:

如何轻松地执行bitblit,就是将所有这些移动到一个名为“后台”的新的空节点下。

现在转到您的快速文件,并为我们将在代码中创建的新节点设置一个占位符变量。
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)
}
}发布于 2017-10-23 15:47:42
有些事你可能想做:
将前景和背景分离为单独的SKS文件,并通过SKReferenceNode将它们加载到您的主SKS文件中。
通过使用SKReferenceNode的代码将这些SKS文件转换为纹理而不是view!.texture(from: node)
确保你的地图集不是以增加抽签数的方式被打破的。
设计代码时,并不是所有节点都在现场,节点越多,代码的速度就越慢。
如果你有SKPhysicsBody,试着尽可能少地使用。这可以是我把多个主体和SKPhysicBody(bodies:)合并在一起,或者创建一个包含多个对象的多边形的实体。
另外,如果你的身体没有通过物理运动(而不是通过SKAction),那么确保isDynamic被设置为false。
如果您正在运行SKAction,请确保您尽可能少地使用这些工具。例如,如果有4个不同的节点以每秒10点的速度移动,则可以将这4个节点放入父节点,并在父节点上运行操作。
https://stackoverflow.com/questions/46759708
复制相似问题