克隆节点和性能、几何和性能; IOS 场景包
Posted
技术标签:
【中文标题】克隆节点和性能、几何和性能; IOS 场景包【英文标题】:Cloning nodes and performance, geometry, and performance; IOS Scenekit 【发布时间】:2015-09-01 18:44:59 【问题描述】:我正在使用 Scenekit 编写一个应用程序,客户希望在 ios 中突破动画的限制。这个特殊的应用程序要求我在屏幕上进行超过 1,500 次重绘。即使有这么多重绘,我也将 FPS 锁定到 60,这很好,但是当我添加客户想要的所有元素时,重绘被推到 7,500 次重绘(是的,这不是一个错误或玩笑,这是重绘次数,尽管它几乎是我在 scenekit 中看到的大多数重绘次数的 50-80 倍)。在这个级别的重绘, 屏幕包含 170 万个顶点和大约 80 万个多边形。这是很多东西,对于这个应用程序来说真的太多了,对任何人都没有用,因为现在我的 FPS 下降到 15-30FPS,这是绘制超过 3K 所预期的屏幕上的几何元素。到目前为止我做了什么:
我克隆所有节点,克隆使我能够突破 Scenekit 的极限。我能够将超过 1.5k 的常量 CAAnimations 放在屏幕上,并将超过 1.8K 的独特几何图形放置在屏幕上的不同位置。
通过循环所有窗口并将其 opaque 属性设置为 yes,我已强制应用程序中的所有窗口、视图和屏幕不透明。
问题是这样的,我可以处理性能问题,但我遇到了节点克隆问题。好吧,节点克隆是可行的,但问题是被推送到屏幕的每个几何图形必须具有不同的大小,而且似乎无法更改每个单独克隆的几何图形。我知道我可以更改“复制”节点的几何形状(SCNNode *node = [masterNode copy];),并且我知道我可以更改克隆节点的材料属性,但是有没有办法改变几何形状克隆节点? Apple 没有提供任何关于改变几何形状的见解,但他们确实谈到了改变材料。我是否可以假设我无法更改克隆的几何尺寸?我可以更改克隆的变换、枢轴、旋转、动画、位置等,但几何图形的大小不会改变。为了我的目的,我只需要一个圆柱体的“高度”变量是可变的,我的其他一切都井井有条,而且,没有其他方法可以在没有节点克隆的情况下将超过 2k 重绘推送到屏幕上,我已经尝试过了在将每个几何图形和具有几何图形的节点声明为其自己的唯一变量时,无需克隆,FPS 降至 10 以下,仅重绘 300 次。
最后,在同样的情况下,从 Scenekit 迁移到 Metal,我应该期望性能提升多少。我不担心数学、细节水平、设置渲染管道的耗时操作或其他任何可能出现的问题,我只是想在这里找到解决我的问题的最佳解决方案,我'我还没有使用过 Metal,因为我不确定考虑到需要多少多边形、顶点和重绘,我会得到不同的结果。谢谢。
【问题讨论】:
重绘?我不明白。你的意思是draw call(每帧)吗? 另外,“通过从 Scenekit 迁移到 Metal” 没有多大意义——SceneKit 同时使用 OpenGL ES 和 Metal,允许您切换哪个它目前通过使用所需的.preferredRenderingAPI
选项初始化您的SCNView
来使用。在金属模式下,SceneKit 甚至可以将(某些)着色器修改器从 ESSL 自动转换为金属着色器语言。所以我不确定你是否希望 SceneKit 使用 Metal _(easy) 或者你想避开 SceneKit 的高级 API 并直接调用 OpenGL/Metal 驱动程序调用 (涉及; 困难 w /oa 对 API 的深刻理解).
【参考方案1】:
有没有办法改变克隆节点的几何形状
我相信您可以更改烘焙几何体本身,但不能更改参数化几何体(不是 SCNCylinder)。所以你可以(改变高度):
缩放节点 更改转换矩阵(也可以缩放,只是换一种方式) 添加几何着色器修改器,可在所需轴上上下移动点改变实际的几何形状会破坏克隆的全部目的,所以我认为没有办法解决这个问题。
最后,在同样的情况下,从 Scenekit 迁移到 Metal 后,我应该期望能提高多少性能。
很多。大约是我所见的 30%,但同样取决于您的设置。 Metal 随 iOS 9 一起提供,您无需执行任何操作即可为您的场景获取它,因此只需更新您的一台设备并在那里试用,看看它是否有帮助!
出于好奇:为什么需要这么多气瓶?你不能欺骗他们的渲染方式吗?
【讨论】:
感谢您的回答。圆柱体的目的是在 iPhone 屏幕上以 3D 形式显示人与人之间的“联系”。我不知道有什么秘籍可以让这更简单,但我希望我做到了。我对这个 Scenekit 的东西有点陌生,但我现在如何注入着色器、使用 plist 进行技术等等。最初,我使用原始几何线条而不是圆柱体,但我不知道如何调整线条的大小,因为 scenekit 没有公开变量来调整原始几何形状。如果您有任何其他建议,请告诉我,我可以处理数学,我只是细节方面的新手。 另外,如果这样会更好,我可以在 Stack exchange 上发布另一个问题。直到现在我才不得不使用堆栈做任何事情,所以即使我已经做了几年的 IOS 开发人员,我也是在这里发帖的新手。我想确保您因回答更多问题而获得奖励或其他任何东西。 您可以提出一个新问题,这样您可能会得到比我更多的答案,因为人们可能不会看这里。不要忘记添加有关最终结果的详细信息! 只是为了强调这个答案最突出的部分:节点的scale
属性是一个向量,因此您可以缩放圆柱体的 y 轴以改变它们的高度,同时保留它们的圆形横截面不变。缩放是在渲染过程中应用的一种转换,因此您可以确保所有 1000 多个圆柱体都共享相同的几何图形,并且不会因为将无数个顶点缓冲区上传到 GPU 而受到性能影响。
使用大量几何图形时的 cenekit 性能。在玩弄 GLKQuanternions 并玩弄 SCNMatrix4 矩阵的单个“.m'X'”值时,我发现 Scenekit 让我们的开发人员可以控制我们可以做什么。 Apple 文档仅对我们可以做的所有事情进行了一个小的 sn-p 概述。再次感谢,Moustach,谢谢你,Rickster。像这样的小消息并不像看起来那么小,正是这种“节点克隆/缩放”信息可以成就或破坏图形密集型应用程序。以上是关于克隆节点和性能、几何和性能; IOS 场景包的主要内容,如果未能解决你的问题,请参考以下文章