#texture #flutter #bindings #external #interface #platform #data-provider

irondash_texture

Rust 为 Flutter 外部纹理提供的绑定

7 个版本 (4 个破坏性更新)

0.5.0 2023年12月26日
0.4.0-dev22023年11月29日
0.3.0 2023年7月28日
0.2.0 2023年7月1日
0.1.1 2022年11月16日

#418 in GUI

每月42次 下载

MIT 许可证

205KB
5K SLoC

irondash_texture

通用的(尽可能)平台接口,用于 Flutter 外部纹理。

核心思想是为你的对象实现 PayloadProvider 特性,该特性提供纹理数据,然后为提供者创建 Texture

struct MyPayloadProvider {
    // ...
}

impl PayloadProvider<BoxedPixelData> for MyPayloadProvider {
    // This method will be called by Flutter during rasterization
    // to get new texture data.
    fn get_payload(&self) -> BoxedPixelData {
        let data: Vec<u8> = make_pixel_data(width, height);
        SimplePixelData::boxed(width, height, data)
    }
}

在拥有 PayloadProvider 之后,你可以创建 Texture

let provider = Arc::new(MyPayloadProvider::new());
let texture = Texture::new_with_provider(engine_handle, provider)?;

let id = texture.id(); // pass this ID back to Flutter to create Texture widget.

/// This tells Flutter that it should refresh the texture and redraw frame.
texture.mark_frame_available();

要创建纹理,你需要有当前 Flutter 引擎的句柄,你可以通过 irondash_engine_context 获取。

BoxedPixelData 负载类型在所有平台上都受支持,尽管像素顺序可能会根据平台而变化。要获取当前平台的像素顺序,请使用 PixelData::FORMAT

除了 BoxedPixelData 之外,还有特定于平台的负载类型,可以用于显示 GPU 纹理。

  • BoxedIOSurface 在 macOS 和 iOS 上提供 IOSurface 纹理
  • BoxedGLTexture 在 Linux 上
  • BoxedTextureDescriptor<ID3D11Texture2D>BoxedTextureDescriptor<DxgiSharedHandle> 在 Windows 上

要在 Android 上使用 GPU 纹理,而不是设置负载,你可以从纹理请求 JNI Surface 或 NDK ANativeWindow

let texture = Texture::<NativeWindow>::new(engine_handle)?;
let native_window = texture.get()?;

线程

PayloadProvider 必须是 SendSync,纹理负载将在光栅线程上请求。

Texture 本身必须在平台线程上创建。然而一旦创建了纹理,你可以将其转换为 SendableTexture,它可以在线程之间移动

let texture = Texture::new_with_provider(engine_handle, provider)?;
let texture = texture.into_sendable_texture();

thread::spawn(move||{
    // texture can now be used from any thread.
    texture.mark_frame_available();
});

依赖项

~1–16MB
~174K SLoC