Thanks for being a part of WWDC25!

How did we do? We’d love to know your thoughts on this year’s conference. Take the survey here

Why does the planeNode in SceneKit flicker when using class property instead of a local variable?

I am working on a SceneKit project where I use a CAShapeLayer as the content for SCNMaterial's diffuse.contents to display a progress bar. Here's my initial code:

func setupProgressWithCAShapeLayer() {
    let progressLayer = createProgressLayer()
    progressBarPlane?.firstMaterial?.diffuse.contents = progressLayer
    
    DispatchQueue.main.async { 
        var progress: CGFloat = 0.0
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
            progress += 0.01
            if progress > 1.0 {
                progress = 0.0
            }
            progressLayer.strokeEnd = progress // Update progress
        }
    }
}

// MARK: - ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        progressBarPlane = SCNPlane(width: 0.2, height: 0.2)
        setupProgressWithCAShapeLayer()
        let planeNode = SCNNode(geometry: progressBarPlane)
        planeNode.position = SCNVector3(x: 0, y: 0.2, z: 0)
        node.addChildNode(planeNode)
    }

This works fine, and the progress bar updates smoothly. However, when I change the code to use a class property (self.progressLayer) instead of a local variable, the rendering starts flickering on the screen:

func setupProgressWithCAShapeLayer() {
    self.progressLayer = createProgressLayer()
    progressBarPlane?.firstMaterial?.diffuse.contents = progressLayer
    
    DispatchQueue.main.async { [weak self] in
        var progress: CGFloat = 0.0
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] timer in
            progress += 0.01
            if progress > 1.0 {
                progress = 0.0
            }
            self?.progressLayer?.strokeEnd = progress // Update progress
        }
    }
}

After this change, the progressBarPlane in SceneKit starts flickering while being rendered on the screen.

My Question:

Why does switching from a local variable (progressLayer) to a class property (self.progressLayer) cause the flickering issue in SceneKit rendering?

Why does the planeNode in SceneKit flicker when using class property instead of a local variable?
 
 
Q