簡體   English   中英

使用 Swift SceneKit 的享元設計模式。 對象重用

[英]Flyweight design pattern with Swift SceneKit. Object-reuse

我正在構建一個增強現實 iPhone 應用程序,它將需要渲染大量 SceneKit 節點。 我想通過伽馬,頭盔,Johnson和Vlissides設計模式描述的Flyweight設計模式整合。 還有這里的教程Flyweight 設計模式但是,我遇到了實現和 Swift 如何處理對象的問題。

TL;DR:在 Swift 中有沒有一種方法可以將相同的SCNNode添加到ARSCNView並讓它顯示在不同的位置?

我有一個名為Box的類,它構建了我想利用 Flyweight 的SCNBox 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對象來顯示框的視圖控制器。

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)

然而,這只會產生一個綠色的盒子; 正確的那一個。 第二個getBox()調用覆蓋了第一個的位置Image 下面 有沒有人對這種模式或 Swift 的實現有任何建議,可以幫助實現這種對象重用模式?

*旁注:我不需要散列對象的位置及其顏色。 因為我會有許多不同顏色和位置的Box es,它會破壞重用相同對象的整個想法。

只有一個綠盒子

SceneKit 已經為你處理好了。 它會自動緩存幾何體的網格,以便可以在幾何體之間有效地重復使用,並且您還可以跨幾何體共享材料。 如果您碰巧有導致相同着色器的重復材質,SceneKit 將只編譯一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM