<!--
{
  "availability" : [
    "iOS: 8.0.0 - 26.0.0",
    "iPadOS: 8.0.0 - 26.0.0",
    "macCatalyst: 13.1.0 - 26.0.0",
    "macOS: 10.8.0 - 26.0.0",
    "tvOS: 9.0.0 - 26.0.0",
    "visionOS: 1.0.0 - 26.0.0",
    "watchOS: 3.0.0 - 26.0.0"
  ],
  "documentType" : "symbol",
  "framework" : "SceneKit",
  "identifier" : "/documentation/SceneKit/SCNSceneRendererDelegate/renderer(_:didApplyAnimationsAtTime:)",
  "metadataVersion" : "0.1.0",
  "role" : "Instance Method",
  "symbol" : {
    "kind" : "Instance Method",
    "modules" : [
      "SceneKit"
    ],
    "preciseIdentifier" : "c:objc(pl)SCNSceneRendererDelegate(im)renderer:didApplyAnimationsAtTime:"
  },
  "title" : "renderer(_:didApplyAnimationsAtTime:)"
}
-->

# renderer(_:didApplyAnimationsAtTime:)

Tells the delegate to perform any updates that need to occur after actions and animations are evaluated.

```
optional func renderer(_ renderer: any SCNSceneRenderer, didApplyAnimationsAtTime time: TimeInterval)
```

## Parameters

`renderer`

The SceneKit object responsible for rendering the scene.

`time`

The current system time, in seconds. Use this parameter for any time-based elements of your game logic.

## Discussion

SceneKit calls this method exactly once per frame, so long as the [`SCNView`](/documentation/SceneKit/SCNView) object (or other [`SCNSceneRenderer`](/documentation/SceneKit/SCNSceneRenderer) object) displaying the scene is not paused.

Implement this method to add game logic to the rendering loop. Any changes you make to the scene graph during this method are immediately reflected in the displayed scene. That is, SceneKit immediately updates the hierarchy of presentation nodes it uses to render the scene (instead of using the [`SCNTransaction`](/documentation/SceneKit/SCNTransaction) class to “batch” your changes).

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)