【发布时间】: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 的深刻理解).