Ios SKPhysicsBody减速程序

Ios SKPhysicsBody减速程序,ios,objective-c,sprite-kit,skphysicsbody,Ios,Objective C,Sprite Kit,Skphysicsbody,我有一个随机的迷宫生成器,它开始构建小的迷宫,然后进入大的层次。“C”是收藏品,“T”是瓷砖。“P”是球员的起始位置。我在下面提供了一个瓷砖贴图示例 性能问题不是当我有一个像这里这样的小6x12模式时;例如,当我有一个20x20的图案时,它就会出现 每个字符都是一个磁贴,每个磁贴都有自己的SKPhysicsBody。瓷砖不是方形的,它们是复杂的多边形,瓷砖之间也不太接触 “C”必须能够一次移除一个,而“T”在该关卡上是永久性的,不能移动。此外,迷宫一次仅显示6x4块瓷砖,并将背景移动到以播放器为

我有一个随机的迷宫生成器,它开始构建小的迷宫,然后进入大的层次。“C”是收藏品,“T”是瓷砖。“P”是球员的起始位置。我在下面提供了一个瓷砖贴图示例

性能问题不是当我有一个像这里这样的小6x12模式时;例如,当我有一个20x20的图案时,它就会出现

每个字符都是一个磁贴,每个磁贴都有自己的
SKPhysicsBody
。瓷砖不是方形的,它们是复杂的多边形,瓷砖之间也不太接触

“C”必须能够一次移除一个,而“T”在该关卡上是永久性的,不能移动。此外,迷宫一次仅显示6x4块瓷砖,并将背景移动到以播放器为中心的视图

我尝试过制作T和C的矩形,这大大提高了性能(但仍然比预期的慢),尽管用户不会在意,但瓷砖的形状太不一样了。

你的职业选手们能想出什么表演技巧来解决这个问题吗

TTTTTT
TCTTCT
TCCCCT
TTCTCT
TCCTCT
TTCCTT
TTTCTT
TTCCCT
TCCTCT
TCTTCT
TTCCCT
TTPTTT
瓷砖不是正方形,而是复杂的多边形


我想这是你的问题。此外,如果你的身体是动态的,那么将它们设置为静态将大大提高性能。你也可以试试。请注意,模拟器上的性能明显低于真实设备上的性能。

您使用的是哪种碰撞方法

SpriteKit提供了几种定义SKPhysicsBody形状的可能性。最佳性能为矩形或圆形:

myPhysicsBody = SKPhysicsBody(rectangleOfSize: mySprite.size)
您还可以定义更复杂的形状,如三角形,其性能较差

使用纹理(SpriteKit将使用所有不透明像素自行检测形状)的性能最差:

myPhysicsBody = SKPhysicsBody(texture: mySprite.texture, size: mySprite.size)

激活“usesPreciseCollisionDetection”也会对您的性能产生负面影响。

感谢您的回复。我确实试着把它们做成长方形,只是想看看它是否能把我的表现提高到期望的水平,但即使这样,它也不是它需要的地方。第三个。在我的问题中,我确实注意到我试着把它们做成长方形,但这对我的目的不起作用
usesPreciseCollisionDetection
已关闭。确定。然后我会尝试使用:bodyWithPolygonFromPath:(CGPathRef)path来定义多边形的形状。因为我支持iOS 7,所以它应该比我使用的纹理更好。我认为最大的问题是,在同一时间有这么多的物理体在现场,尽管不是所有的物理体在任何时候都可以到达。有没有一种方法可以在物理实体上下移动时创建/破坏它们?这可能会对我有很大帮助。我在屏幕上有相当数量的物理体。但是只有矩形。我猜您的平铺大部分是静态的,并且动态标志设置为false?从场景中删除节点后,物理实体应该不会对性能产生影响。当然,您应该检查对已删除节点的引用是否阻止ARC将其从内存中删除。这可能会在一段时间后对性能产生影响。对不起,没有其他想法。那是400个形状复杂的物理体,相当多。改进其形状,以使用创建所需碰撞行为的最小顶点数。请注意,物理形状通常只有一个非常粗略定义的形状。Stefan发布的宇宙飞船只需3个顶点就可以很好地工作,最多可能5到9个顶点,这取决于实际需要的精确程度。你可能想考虑将它们分开,这样它们就不会在每帧中产生碰撞。我用了8分,虽然它在我的iPhone6上已经足够好了,但4s没有那么火爆。我在想,也许有一种简单的方法可以在物理物体处于视图的某个位置时加载它们?并在它们离开视图时将其移除。这会使处理器爬行的次数超过它已经爬行的次数吗?