gpt4 book ai didi

objective-c - SceneKit Cocoa 添加贴花

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:14 25 4
gpt4 key购买 nike

是否有足够的方法向 SCNNode 添加贴花(纹理)?现在我所能做的就是用 SCNPlane 几何体创建新的 SCNNode为其漫反射内容分配纹理并将其添加到场景中......这种方法非常低效。

我想添加一个不会成为场景一部分的贴花 - 以提高游戏的性能。因为我想在地板节点上有比较多的贴花。

也许有点类似于粒子内部的工作原理?或者其他一些快速图像绘制方法。

我已经尝试过@rickster 的建议 1

Use SKEffectNode as a buffer in the SpriteKit scene — throw splatters into an effect node until it gets to a certain number of children, then turn on its shouldRasterize option so that it doesn't re-render its children anymore (and start using a new effect node for more splatters).

在同一个 SceneKit showreel 项目中 - 仅此一项就已经取得了不错的结果,FPS 在继续播放场景后 5 分钟内没有下降,这很好。

期待实现建议 #2- 我相信它会减少 2D 场景渲染时间(现在这是相当长的时间)。

在这个屏幕截图中有 5k 个贴花

5k

最佳答案

我建议使用 SpriteKit 场景作为“溅射”几何体的 Material 。苹果有sample code这说明了很多你在这里的目的:

  1. 制作一个作为 SceneKit 几何体 Material 的 SpriteKit 场景。
  2. 当 3D 世界中的某些东西需要飞溅时,使用 HitTest 来查找 Material 中的纹理坐标并将其转换为 SpriteKit 场景坐标。
  3. 在 SpriteKit 场景中的该位置放置一个 Sprite 以创建贴花。

根据您的 other question 判断您似乎已经开始朝着这个方向前进...如果您详细说明问题,也许您会得到更好的帮助?


注意:该示例代码在 iOS 9/macOS 10.11 及更高版本上存在错误,会干扰飞溅效果。您可以通过在 AAPLGameViewController.m 中找到这一行来解决它:

    ball.physicsBody.collisionBitMask = ~(0x4);

并在其后添加这一行:

    ball.physicsBody.contactTestBitMask = ~(0x4);

您可能会在该演示中注意到,一段时间后,您的帧速率开始下降 — SpriteKit 场景中 Sprite 数量的不断增加使得 2D 渲染占用了越来越多的渲染循环。

enter image description here(也许这是提示您 other question 的问题?)

不过,即使没有“截屏”纹理的能力,也有一些方法可以针对这种情况进行优化。调查的一些想法:

  1. 使用 SKEffectNode 作为 SpriteKit 场景中的缓冲区 — 将飞溅物扔到效果节点中,直到达到一定数量的子节点,然后打开其 shouldRasterize选项,这样它就不会再重新渲染它的子节点(并开始使用新的效果节点来获得更多的飞溅效果)。

  2. 很多 2D 时间都浪费在绘制不可见的 SK Sprite 上,因为它们被其他 Sprite 掩埋了。 (或者大部分被掩埋,只有几个像素可见。)因为你的,嗯,“油漆”都是相同的颜色,你可以使用一些简单的方法将你的 SpriteKit 场景分 block 成区域,并决定一个区域何时被绘制完全覆盖——此时,您可以从该区域移除所有 Sprite ,用一个“完全覆盖” Sprite 替换它们,并停止在该区域添加新 Sprite 。 quadtree可能是在这里使用的好工具。

  3. 如果您想通过着色器修改器而不是使用基于 SpriteKit 的 Material 进行自定义绘图,那么 SceneKit HitTest 到纹理坐标映射技巧同样有效,您也许可以找到更有效的方法在那里进行长期覆盖跟踪(可能借助#3 中的一些技巧)。

  4. 如果您的飞溅不是经常发生,您可以在 CPU 上渲染它们并在 Material 上设置一个新图像。

  5. 一个想法的远景,不知道它是否可行或性能良好:使用 Core Image as an accumulation buffer绘制飞溅,并将其渲染到与 Material 内容设置相同的 MTLTexture 中。 (使用 SceneKit 的 willRenderScene 回调每帧渲染一次。)

关于objective-c - SceneKit Cocoa 添加贴花,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40913688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com