7 个版本 (4 个破坏性更新)
0.5.0 | 2023年12月26日 |
---|---|
0.4.0-dev2 | 2023年11月29日 |
0.3.0 | 2023年7月28日 |
0.2.0 | 2023年7月1日 |
0.1.1 | 2022年11月16日 |
#418 in GUI
每月42次 下载
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
必须是 Send
和 Sync
,纹理负载将在光栅线程上请求。
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