Ios 实现可攻丝形状的最佳方法?

Ios 实现可攻丝形状的最佳方法?,ios,objective-c,swift,sprite-kit,core-graphics,Ios,Objective C,Swift,Sprite Kit,Core Graphics,我正在构建一个应用程序,它提供一个类似于photoshop或illustrator的可编辑画布(目前使用的是SpriteKit)。正如您可能想象的那样,在显示大量节点(1000+个)时,我遇到了一些性能问题 目前,我有一个SKScene,上面有SKShapeNodes。它们目前没有任何图像,只是用颜色填充。它们的形状路径(CGPaths)从圆到贝塞尔路径各不相同。每个形状当前都有一个SKPhysicsBody,其路径与用于检测轻敲的渲染形状相同 性能问题可通过以下方式描述: 慢度在添加1000

我正在构建一个应用程序,它提供一个类似于photoshop或illustrator的可编辑画布(目前使用的是
SpriteKit
)。正如您可能想象的那样,在显示大量节点(1000+个)时,我遇到了一些性能问题

目前,我有一个
SKScene
,上面有
SKShapeNodes
。它们目前没有任何图像,只是用颜色填充。它们的形状路径(
CGPath
s)从圆到贝塞尔路径各不相同。每个形状当前都有一个
SKPhysicsBody
,其路径与用于检测轻敲的渲染形状相同

性能问题可通过以下方式描述:

  • 慢度在添加1000个节点(圆圈)时,每个节点使用大约0.1mb的内存
  • 移动1000个节点(圆)时的慢度
  • 从1000个节点(圆)生成纹理时的慢度
禁用PhysicsBody不会显著提高性能,但会提高CPU负载(从恒定的60%跳到1%左右)

大多数用户不会使用1000个节点,但我希望实现最佳解决方案

我想要的是两层有两层:

  • 一个渲染层,在该层上,我希望能够使用笔划和填充渲染
    CGPath
    s(最好选择笔划端盖样式和其他小东西)
  • 一个交互层,在该层上,我希望能够检测
    CGPath
    s内部的点击,并用一种颜色来指示高亮显示

如何实现此解决方案或类似解决方案,以提高渲染1000个圆的速度?

不要使用SKShapeNode,每个shapenode需要1个绘制调用。可以创建形状,然后在将其添加到场景之前将其“投射”到SpriteNode:

func shapeToSprite(_ shape: SKShapeNode) -> SKSpriteNode {
  let sprite = SKSpriteNode(texture: SKView().texture(from: shape))
  sprite.physicsBody = shape.physicsBody // Or create a new PB from alpha mask (may be slower, IDK)
  shape.physicsBody = nil
  return sprite
}

override func didMove(to view: SKView) {
  let shape = SKShapeNode(circleOfRadius: 60)
  addChild(shapeToSprite(shape))
}
但是,如果您需要以缩放或几何体无法实现的方式不断编辑形状的大小/形状,这将非常糟糕

要检测这样的点击,您只需要1,为SpriteNode设置一个名称,然后在touchesbearth中查找它,或者2,对SpriteNode进行子类化并覆盖它的touchesbearth

此外,如果您只需要有一个静态图像,您可以位blit数千个节点到一个纹理。


因此,如果你不需要每个节点都可以随时触摸,你可以选择使用PhysicsBody和不使用PhysicsBody,或者将层从bitblitted切换到active。

“我正在使用SpriteKit构建类似photoshop或illustrator的东西”哈@埃尔托马托,这并不像听起来那么疯狂!SpriteKit是许多模拟可编辑画布行为的好工具。很明显,正如我所描述的,它有局限性。我对此没有问题。我以为你想说你正在用Photoshop和Illustrator制作一个游戏。嘿,如果你不介意的话,请把我的答案投上你接受的一票:)谢谢!