【问题标题】:Most optimal method of implementing tappable shapes?实现可点击形状的最佳方法?
【发布时间】:2017-06-09 23:15:06
【问题描述】:

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

目前,我有一个带有SKShapeNodesSKScene。他们目前没有任何图像,只是用颜色填充。它们的形状路径 (CGPaths) 从圆形到贝塞尔路径不等。每个形状当前都有一个SKPhysicsBody,其路径与用于检测点击的渲染形状相同。

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

  • 添加 1000 个节点(圆)时速度变慢,每个节点使用大约 0.1mb 的内存
  • 移动 1000 个节点(圆)时的缓慢
  • 从 1000 个节点(圆)生成纹理时速度较慢

禁用 PhysicsBodies 不会显着提高性能,但会提高 CPU 负载(从恒定的 60% 跃升至 1% 左右)

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

我想要的是两个有两层:

  • 一个 render 层,我希望能够在其上使用笔触和填充来渲染CGPaths(最好选择笔触端盖样式以及其他小东西)
  • 一个 interaction 层,我希望在该层上能够检测到CGPaths 内的点击,并用颜色描边 CGPath 以指示突出显示。

我怎样才能完成这个或类似的解决方案来提高我可以渲染 1000 个圆圈的速度?

【问题讨论】:

  • “我正在使用 SpriteKit 构建类似 Photoshop 或 illustrator 的东西”嗯!?
  • @ElTomato 这并不像听起来那么疯狂! SpriteKit 作为许多模拟可编辑画布行为的好工具。正如我所描述的,显然它有局限性。
  • 我对此没有意见。我以为您想说您正在使用 Photoshop 和 Illustrator 构建游戏。和平。
  • 嘿,如果您不介意,请点赞我接受的回答:) 谢谢!

标签: ios objective-c swift sprite-kit core-graphics


【解决方案1】:

不要使用 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))
}

如果您需要以一种无法通过缩放或 SKWarpGeometry 实现的方式不断编辑形状的大小/形状,这会很糟糕

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

另外,如果您只需要一个静态图像,您可以将数千个节点位blit 到 1 个纹理上。 Sprite Kit: A Lot of sprites (1000+) with Bit Blitting

http://www.sdkboy.com/2014/01/spritekit-bit-blitting-by-drawing-to-a-texture-for-performance-optimization/

因此,如果您不需要每个节点始终都可触摸,您可以在有和没有物理体之间交替,或者将层从位块切换到活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    相关资源
    最近更新 更多