拡張現実 iPhone アプリケーションを作成していますが、大量の SceneKit ノードをレンダリングする必要があります。Gamma、Helm、Johnson、および Vlissides によるDesign Patternsで説明されている Flyweight デザイン パターンを統合したいと考えています。また、チュートリアルはこちらFlyweight Design Pattern ただし、実装と Swift がオブジェクトを処理する方法に関する問題に直面しています。
TL;DR: Swift で同じSCNNode
ものをARSCNView
複数回追加して別の位置に表示する方法はありますか?
Flyweight を活用したいBox
buildsというクラスがあります。aSCNBox
の本質的な状態Box
は次元です。外部状態は、その色と位置です。
ボックスクラス
class Box {
var size:CGFloat
var position:(Float, Float, Float)
var color:UIColor
var node:SCNNode!
init(color:UIColor){
self.color = color
/*Set the following below as default values*/
self.size = CGFloat(0.05) //Side length
self.position = (0,0,0)
self.createBox()
}
private func createBox() -> Void {
/*Creating box and setting its color*/
self.node = SCNNode(geometry: SCNBox(width: size, height: size, length: size, chamferRadius: 0))
self.node.geometry?.firstMaterial?.diffuse.contents = self.color
}
func draw(sceneView: ARSCNView) -> Void {
sceneView.scene.rootNode.addChildNode(self.node)
}
}
以前のオブジェクトが同じ色であるかどうかをチェックするディクショナリを使用してデザインを実装するファクトリ クラスがあります。その場合はオブジェクトを再利用し、そうでない場合は新しいオブジェクトを作成します。
ファクトリークラス
class BoxFactory{
var hash:[UIColor:Box] = [UIColor:Box]()
func getBox(color c:UIColor) -> Box {
/*Check if box of color c already exists*/
if(self.hash[c] != nil){
return self.hash[c]!
}
/*Create a new box if it does not*/
let b:Box = Box(color: c)
self.hash[c] = b
return b
}
}
そしてARSCNView
、ボックスを表示するオブジェクトを保持するView Controller。
let factory:BoxFactory = BoxFactory()
/*Create two boxes of same color. One on the left and on the right*/
let leftBox:Box = factory.getBox(color: UIColor.green)
leftBox.position = SCNVector3(-0.1,0,0)
leftBox.draw(sceneView: self.sceneView)
let rightBox:Box = factory.getBox(color: UIColor.green)
rightBox.position = SCNVector3(0.1,0,0)
rightBox.draw(sceneView: self.sceneView)
ただし、これにより生成される緑色のボックスは 1 つだけです。正しいもの。2 番目のgetBox()
呼び出しは、最初の位置Image belowをオーバーライドします。このパターンの実装、またはオブジェクトの再利用のこのパターンを実現するのに役立つ Swift について、誰かアドバイスはありますか?
*補足:オブジェクトの位置とその色をハッシュする必要はありません。Box
色と位置が異なる多くのes があるため、同じオブジェクトを再利用するという考え全体が無効になります。