何时使用 SCNGeometrySource

Posted

技术标签:

【中文标题】何时使用 SCNGeometrySource【英文标题】:When to use SCNGeometrySource 【发布时间】:2017-04-25 13:21:33 【问题描述】:

我正在使用 SceneKit 构建游戏,但我无法决定将 .dae 模型存储在 .scnassets 文件夹中并加载 .dae 模型还是在运行时使用 Vertices/Indecies/Normals 以编程方式创建模型更好。

在性能方面,是否值得使用 Vertices/Indecies/Normals 使用 SCNGeometrySource 和 SCNGeometryElement 手动创建 SCNGeometry?或者使用 SCNScene(named: "Scenes.scnassets/ModelName.scn") 加载模型就可以了?

【问题讨论】:

【参考方案1】:

您提到了三种方法:DAE 文件、SCN 文件和以编程方式生成的几何图形。 SCN 和 DAE 不是一回事。 DAE 是一种 XML 格式 (compressed, for ios targets, using Apple's internal scntool)。 SCN 是存档的NSObject

最快的性能来自使用 SceneKit 场景文档(.SCN 文件)。

如果您的模型已经在 3D 工具中构建,您可以导入 DAE 文件并使用 Xcode 的场景编辑器 (how to convert .dae to .scn files in SceneKit) 将其保存为 SCN。您可以使用 NSSecureCoding 从您的 SCNScene 实例以编程方式创建它。

如果您必须以编程方式生成场景,请使用SCNGeometrySource(或SCNGeometry)。但是如果你可以在你的应用程序发布之前构建它,你应该编写一个辅助程序来创建场景,然后用 NSSecureCoding 归档。然后,您将拥有一个可以嵌入到最终产品中的 .SCN 文件。

查看模型 I/O 框架以了解更多文件格式选项(特别是 MDLAsset)。

【讨论】:

谢谢哈尔的回复。抱歉指向 .dae,实际上我使用的是从 .dae 转换而来的 .scn,选择是在手动生成几何图形和从 .scn 文件加载它之间进行选择。我认为以编程方式生成几何图形更快,因为无需打开和取消归档文件 (.scn)。 测量。如果您已经编写了以编程方式生成几何图形的代码,则可以快速编写一个定时测试来比较取消归档和动态创建。【参考方案2】:

我同意 Hal,最好使用 SceneKit 的原生文件格式 (.scn)。

我只是想与您分享一些关于从 Collada 文件导入模型或使用顶点/索引/法线以编程方式创建模型的问题的一些见解。

根据我的个人测试,我注意到 Collada 文件使用唯一顶点导入几何图形,而以编程方式导入几何图形时,您可以使用共享顶点。

例如,我使用共享顶点导入了一个模型,该模型大约有 70K 个顶点。当我使用 Collada(唯一顶点)导入相同的模型时,顶点数超过 200K。

祝你的 SceneKit 游戏好运!

【讨论】:

哦,这是一个有用的花絮!您是否将 Collada 与同一模型的其他模型 I/O 支持格式进行了比较? 其实我有,它们都使用唯一的顶点。我发现使用共享顶点的唯一方法是以编程方式进行。是的,当我了解到这一点时,我真的很惊讶,尤其是在为每一点都很重要的移动设备开发时。很高兴在 Hal 附近见到您,感谢您对社区的大力帮助。 只是另一个需要记住的细节。如果您以编程方式导入模型以使用共享顶点,如果您以除 .scn 之外的任何其他格式导出该模型,它会将其转换回唯一顶点。

以上是关于何时使用 SCNGeometrySource的主要内容,如果未能解决你的问题,请参考以下文章

何时使用,何时不使用 Try Catch Final

何时使用 Storyboard 以及何时使用 XIB

何时使用 GetXXX() 方法以及何时使用 Getter 属性

Vuex - 何时使用 getter 以及何时使用状态

何时使用 .First 以及何时将 .FirstOrDefault 与 LINQ 一起使用?

何时使用 OSGi EventAdmin,何时不使用?