Rive makes use of various different renderers depending on platform and runtime. We’re working towards unifying the default renderer used across all platforms/runtimes with the Rive Renderer.
Certain features, such as Vector Feathering, are only supported through the Rive Renderer. See our Feature Support page for more information.

Renderer Options and Default

You can opt-in to use a specific renderer, see Specifying a Renderer. The table below outlines the available, and default, renderers for Rive’s runtimes:
RuntimeDefault RendererOptions
AndroidRiveRive / Canvas / Skia (removed as of v10.0.0)
AppleRiveRive / Core Graphics / Skia (deprecated in v6.0.0)
React NativeRiveSee Apple and Android
Web (Canvas)Canvas2DCanvas2D
Web (WebGL)SkiaSkia
Web (WebGL2)RiveRive
FlutterNo defaultRive / Flutter (Skia / Impeller)

Rive Renderer

The Rive Renderer is a new rendering engine designed to provide better performance and visual fidelity across all platforms. It leverages modern graphics APIs and techniques to deliver high-quality rendering for Rive graphics. It also allows Rive to innovate with new features, such as Vector Feathering, which are only supported through the Rive Renderer. See our Feature Support page for more information.

Starting Version

The Rive Renderer was made the default renderer in Apple runtimes starting at v6.0.0, however, we recommend installing the latest version of the dependency to get the latest updates. See the CHANGELOG for details on the latest versions.

Performance

The Rive Renderer will shine best on Apple runtimes in memory usage as an animation plays out, in comparison to previous default renderers.With UIKit, you’ll be able to see the best performance differences by drawing multiple times on a single RiveView, rather than creating multiple instances of RiveViews, or multiple RiveViewModels.Example: See this stress test example to see how you can override the drawing function on RiveView to draw multiple times on the same view, with each graphic at an offset. You can switch out the renderer with the above config and test out the performance for yourself!

Specifying a Renderer

See below for runtime instructions to enable a specific renderer.

Getting Started

Options: Rive (default) / Core Graphics / Skia (deprecated in v6.0.0)Below are some notes on configuring the renderer in UIKit and SwiftUI.

UIKit

Set the global renderer type during your application launch:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        RenderContextManager.shared().defaultRenderer = RendererType.riveRenderer
        return true
    }

    ...
}

SwiftUI

New SwiftUI applications launch with the App protocol, but you can still add UIApplicationDelegate functionality.

iOS

Create a new file and class called AppDelegate as such, including a line to set the defaultRenderer to RendererType.riveRenderer:
import UIKit
import Foundation
import RiveRuntime

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        RenderContextManager.shared().defaultRenderer = RendererType.riveRenderer
        return true
    }
}
Next, at the entry point of your application, use UIApplicationDelegateAdaptor to set the AppDelegate created above for the application delegate.
@main
struct MyRiveRendererApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

macOS

Create a new file and class called AppDelegate as such, including a line to set the defaultRenderer to RendererType.riveRenderer:
import Foundation
import RiveRuntime

class AppDelegate: NSObject, NSApplicationDelegate {
    func application(_ application: NSApplication, applicationDidFinishLaunching notification: Notification) -> Bool {
        RenderContextManager.shared().defaultRenderer = RendererType.riveRenderer
        return true
Next, at the entry point of your application, use UIApplicationDelegateAdaptor to set the AppDelegate created above for the application delegate.
@main
struct MyRiveRendererApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}