【发布时间】:2015-07-08 00:19:48
【问题描述】:
在更新模型时,定位、更新和/或添加或删除与底层模型相对应的 SceneKit 节点的最明智的方法是什么?
我不确定如何最好地表达这个问题,所以有一个最小的例子可能更容易:
我有一些东西,假设是一组彩色对象,我可能想使用 Quartz 将二维表示为正方形,或者使用 SceneKit 将其表示为三维。由于两种情况下的基础数据相同,因此抽象出模型并定义如下内容似乎更合适:
struct Foo {
var uid: String
var color: UIColor
var position: [Float] // array of 3 floats for x, y, z
}
然后我有:
var collectionOfFoo: [Foo]
然后我可以通过循环我的collectionOfFoo 并为每个具有适当颜色和位置等的SCNBox 来构建我的 SceneKit 场景。
问题:用户可能会在collectionOfFoo 中添加一个新的Foo,或者删除一个现有的Foo,或者更改一个现有的Foo 的存储值,然后SceneKit 场景必须是更新以反映这一点。破坏场景并从头开始重建似乎很浪费,而且速度太慢了。这可能需要每秒调用数百次。
我当前的方法:我为与给定Foo 对应的 SceneKit 节点指定一个与Foo 的uid 匹配的名称,然后最终使用childNodeWithName 手动搜索节点层次结构。但是,这确实不能很好地扩展(帧速率差),并且感觉“错误”,好像可能有一种更容易/更惯用的方式来做到这一点。我一直在看ReactiveCocoa 之类的东西,因为它似乎解决了这类问题,但我不确定这是否过于复杂。
如果我使用的是 Objective-C,我可能会尝试创建一个 Foo 类,其中每个实例只包含一个指向相关 SceneKit 节点的指针;这不会很优雅,但至少会很有效并且会给出预期的结果。我只是在寻找一种更好的方法,并且可以在 Swift 中使用。
非常欢迎提出建议,非常感谢 - 我仍在开发我的第一个应用程序,并且仍然认为自己是这方面的初学者。
【问题讨论】:
标签: swift cocoa-touch scenekit reactive-cocoa