将空SKView添加到UICollectionView单元格使iPhone 6(iOS 9.x)几乎不可能滚动。让我们说集合视图包含6个项目,其中前3个是可见的,水平滚动接下来的3个项目需要3秒时间带有急动。
以下是代码的相关部分:
lineItemMem
如何在我的UICollectionViewCells中平滑滚动SKViews?
在iOS 8.x上,我在呈现此视图时遇到异常:
答案 0 :(得分:4)
我不知道具体的答案是什么w.r.t.表现不佳的原因,但我可以给你一些关于如何进行的指示。
要做的第一件事是分析代码。使用Instruments确定应用在开始滚动时花费最多时间的位置。设置SKView
是因为它们在屏幕上出现了昂贵的部分吗?还是一遍又一遍地绘制所有精灵视图?精灵视图中的 是否需要花费很长时间才能绘制?我听说SKShapeNode
可能会拖累表现。如果从SKView
s中删除所有子节点会发生什么?
一旦您知道瓶颈在哪里,您就可以决定如何继续。从你的评论来看,听起来你只是使用SKView
来渲染一些路径,而且一旦他们被吸引,你可能不需要那些动画?如果是这样,也许您可以使用单个屏幕外SKView
将路径渲染到图像中,然后将该图像插入到集合单元格中。人们总是使用充满图像的集合,并且它们滚动得很漂亮。
答案 1 :(得分:3)
我最初的建议就是这样:缩小对框架交互和建立关系的可能性的期望。
查看CAShapeLayer并查看它是否可以完成您尝试使用SKShapeNode和着色器进行的操作。 CAShapeLayers有一个“shouldRasterize”功能,然后您可以应用核心图像过滤器之类的东西,这可能会让您接近所需的结果而不使用SKViews,SKShapeNode和SKShaders。
您遇到的问题是人为地夸大了Apple新版API和框架内的质量和性能预期,以及它们互动和相互包容的能力。
这不是你的错。
很久以前,Apple已经掌握了揽客和推销技巧。
很长一段时间,这些艺术都被保留用于实体产品发布 - 人们购买的设备的推销和推广。
在已故伟大的乔布斯(可能是RIP)的生病和死亡的某个时候,正在进行一次转型,以更积极地推动软件的快速开发和早期发布到App Store。
这大部分是Android和谷歌的战争的一部分。必须有一些共识(可能是现在领先的公司供应商关注渠道),尽可能多的应用程序进入商店是一种消除和/或击败Android的方法。
为此,创建了iOS 7,UICollectionViews,AutoLayout以及各种其他“精彩”好东西,旨在消除设计和设计人员对大多数应用程序创建的需求(和关注)。
这些设施给人的印象是,任何事情都可以用API完成,而且几乎不需要考虑设计,甚至技术设计。
所以开发人员深入研究框架,眼睛炯炯有神,思绪浓密,乐观地看待他们的机会或实现他们想象的任何东西......如果他们只是通过他们认为与之相关的框架和API的混合使用它们存在于他们对WWDC视频和其他Apple宣传材料的理解框架之间。
不幸的是,前面提到的推销技巧和表演意味着你认为可能的东西实际上仅限于你所展示的文字演示。交叉关系和成功的框架的推断和建议的可能潜力正是......可能的未来功能。
除了字面上所展示的内容之外,大多数内容都被打破,或者以某种其他方式受到大规模约束和不良表现。在某些情况下,所演示的内容随后也会被破坏或者无法释放。
因此,如果您花时间想象在UICollectionViews中组合SKViews,以及这种关系应该有效,那么这个假设就是您的问题。
当你开始考虑SKShapeNodes和Shaders时,这会变得更糟,这两个都在SceneKit中有已知问题。显然你发现问题是UICollectionViews中的SKViews不具备性能。这是第一个问题。你将会有更多的问题从SKShapeNodes和你的着色器中获取性能,然后SKShapeNode的不变性问题也会出现在你的动画中。
这不是一个不正确的假设,你已经开始相信框架的模块化是一个东西,并且是iOS大规模框架的一个巨大特征。
然而,这是所有早期的事情,并没有提及。 Sprite Kit从根本上打破了iOS 9,你可以在这里阅读更多关于它的许多问题:
https://forums.developer.apple.com/thread/14487
这里:
https://forums.developer.apple.com/thread/20758
这里:
https://forums.developer.apple.com/thread/17463
关于使用iOS 9中使用Scene Kit的问题的原因和/或性质,我没有正式的沟通,尽管有许多问题的噪音。
困扰很多的一个巨大问题是UIKit和SKViews的任何使用(无论哪种方式都可以相互关联)都会在iOS 9中造成巨大的性能问题。此时除了保留这些问题外,没有明显的方法可以解决这个问题。两个框架分开。
答案 2 :(得分:0)
iOS 9与iOS 8的一个重大变化是从OpenGL切换到适用于SpriteKit和SceneKit的Metal。我建议您尝试覆盖该默认值,并通过将键/值对PrefersOpenGL
/ YES
添加到Info.plist中切换回OpenGL。请参阅Technical Q&A QA1904, Specifying the renderer for SpriteKit and SceneKit。