![]() |
VOOZH | about |
dotnet add package BlazorBlaze --version 1.5.2
NuGet\Install-Package BlazorBlaze -Version 1.5.2
<PackageReference Include="BlazorBlaze" Version="1.5.2" />
<PackageVersion Include="BlazorBlaze" Version="1.5.2" />Directory.Packages.props
<PackageReference Include="BlazorBlaze" />Project file
paket add BlazorBlaze --version 1.5.2
#r "nuget: BlazorBlaze, 1.5.2"
#:package BlazorBlaze@1.5.2
#addin nuget:?package=BlazorBlaze&version=1.5.2Install as a Cake Addin
#tool nuget:?package=BlazorBlaze&version=1.5.2Install as a Cake Tool
High-performance rendering library for Blazor WebAssembly with three rendering technologies.
<PackageReference Include="BlazorBlaze" />
<PackageReference Include="BlazorBlaze.Server" />
Interactive scene graph with draggable controls for building visual editors.
@using BlazorBlaze
@using ModelingEvolution.Drawing
@using SkiaSharp
<BlazorCanvas Engine="_engine" Size="Sizes.HD" />
@code {
private BlazeEngine _engine = new BlazeEngine(Sizes.HD);
protected override void OnInitialized()
{
// Circle with drag support
var circle = new CircleControl(new SKPoint(100, 100), 50);
circle.Fill = SKColors.Red;
circle.EnableDrag();
circle.OnClick += (s, e) => { /* handle click */ };
_engine.Scene.AddControl(circle);
// Rectangle
var rect = new RectangleControl(new SKRect(200, 50, 350, 150));
rect.Fill = SKColors.Blue;
rect.EnableDrag();
_engine.Scene.AddControl(rect);
// Polygon
var points = new Point<float>[] { new(300, 200), new(350, 300), new(250, 300) };
var polygon = new PolygonControl(new Polygon<float>(points));
polygon.Fill = SKColors.Green;
polygon.EnableDrag();
_engine.Scene.AddControl(polygon);
}
}
SkiaSharp-based charts for data visualization.
@using BlazorBlaze.Charts
@using SkiaSharp
@using SkiaSharp.Views.Blazor
<SKCanvasView OnPaintSurface="OnPaintSurface" EnableRenderLoop="true" />
@code {
private BarChart _chart = new();
private string[] _labels = { "A", "B", "C" };
private float[] _values = { 45.2f, 72.8f, 33.1f };
protected override void OnInitialized()
{
_chart.SetData(
title: "Demo",
labels: _labels, labelCount: _labels.Length,
values: _values, valueCount: _values.Length,
minScale: 0f, maxScale: 100f,
units: "%", valueFormat: "{0:F1}",
enableMinMaxTracking: true
);
}
private void OnPaintSurface(SKPaintSurfaceEventArgs e)
{
_chart.Location = new SKPoint(0, 0);
_chart.Size = new SKSize(e.Info.Width, e.Info.Height);
_chart.Render(e.Surface.Canvas);
}
}
High-performance binary streaming for real-time graphics over WebSocket.
Protocol v2 Features:
Performance (stress test with 20K points @ 60 FPS):
using BlazorBlaze.Server;
using BlazorBlaze.VectorGraphics;
app.UseWebSockets();
app.MapVectorGraphicsEndpointV2("/ws/stream", async (IRemoteCanvasV2 canvas, CancellationToken ct) =>
{
var points = new SKPoint[] { /* polygon vertices */ };
while (!ct.IsCancellationRequested)
{
canvas.BeginFrame();
// Layer 0 - Background elements (stateful context)
var bg = canvas.Layer(0);
bg.SetStroke(new RgbColor(100, 100, 100));
bg.SetThickness(1);
bg.DrawRectangle(0, 0, 800, 600);
// Layer 1 - Animated content with transforms
var layer = canvas.Layer(1);
layer.SetStroke(new RgbColor(255, 100, 100));
layer.SetThickness(2);
layer.Save();
layer.Translate(400, 300);
layer.Rotate(angle);
layer.DrawPolygon(points);
layer.Restore();
// Layer 2 - Static overlay (Remain = no update)
canvas.Layer(2).Remain();
await canvas.FlushAsync(ct);
await Task.Delay(16, ct); // ~60 FPS
}
});
@using BlazorBlaze.VectorGraphics
@inject ILoggerFactory LoggerFactory
<SKCanvasView @ref="_canvasView" OnPaintSurface="OnPaintSurface" EnableRenderLoop="true" />
@code {
private RenderingStreamV2? _stream;
private SKCanvasView? _canvasView;
protected override void OnInitialized()
{
_stream = new RenderingStreamV2(1200, 800, LoggerFactory);
}
private async Task Connect()
{
var uri = new Uri("ws://localhost:5100/ws/stream");
await _stream!.ConnectAsync(uri);
}
private void OnPaintSurface(SKPaintSurfaceEventArgs e)
{
var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.Black);
_stream?.Render(canvas); // Lock-free, composites all layers
}
// Pool statistics available for monitoring
// _stream.PoolInUse, _stream.PoolCached, _stream.PoolTotalCreated
}
app.MapVectorGraphicsEndpoint("/ws/simple", async (IRemoteCanvas canvas, CancellationToken ct) =>
{
canvas.Begin();
canvas.DrawPolygon(points, new DrawContext
{
Stroke = new RgbColor(255, 100, 100),
Thickness = 2,
Offset = new SKPoint(100, 100),
Rotation = 45f,
Scale = new SKPoint(1.5f, 1.5f)
});
await canvas.FlushAsync(ct);
});
cd samples/SampleApp
./run.sh
Opens at http://localhost:5100
Demo pages:
/canvas - BlazorCanvas with draggable shapes/barchart - Bar chart demo/timeseries - Time series chart with live updates/stress - WebSocket streaming 20K points @ 60 FPS (Protocol v2)# Clean build
cd samples/SampleApp
dotnet clean
rm -rf bin obj publish
rm -rf ../SampleApp.Client/bin ../SampleApp.Client/obj
./run.sh
Server Side:
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββ
β IRemoteCanvasV2 ββββ>β VectorEncoderV2 ββββ>β WebSocket β
β ILayerCanvas β β (binary protocol)β β (send) β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββ
Client Side:
βββββββββββββββ βββββββββββββββββββββ ββββββββββββββββββ βββββββββββββ
β WebSocket ββββ>β VectorStreamDecoderββββ>β RenderingStage ββββ>β LayerPool β
β (receive) β β (parse + decode) β β (frame mgmt) β β (recycle) β
βββββββββββββββ βββββββββββββββββββββ ββββββββββββββββββ βββββββββββββ
β
v
ββββββββββββββββββ
β RenderingStreamV2β
β (lock-free render)β
ββββββββββββββββββ
Key Components:
LayerPool - Thread-safe pool of LayerCanvas instances using ConcurrentBagRenderingStage - Manages frame lifecycle with lock-free consumer accessRef<T> / RefArray<T> - Reference-counted smart pointers for safe frame sharingLease<T> - Pool return wrapper, returns layer to pool on disposesrc/
BlazorBlaze/ # Main library (WASM-compatible)
Charts/ # BarChart, TimeSeriesChart
VectorGraphics/ # Streaming, Decoder, RenderingStream
Protocol/ # IStage, LayerPool, LayerCanvas
ValueTypes/ # Ref<T>, RefArray<T>, Lease<T>
BlazorBlaze.Server/ # Server extensions (ASP.NET Core)
IRemoteCanvasV2 # Multi-layer canvas interface
VectorEncoderV2 # Binary protocol encoder
samples/
SampleApp/ # Server + WebSocket endpoints
SampleApp.Client/ # Blazor WASM client
tests/
BlazorBlaze.Tests/ # Unit tests (177 tests)
benchmarks/
BlazorBlaze.Benchmarks/ # Performance benchmarks
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 5 NuGet packages that depend on BlazorBlaze:
| Package | Downloads |
|---|---|
|
RocketWelder.SDK
High-performance video streaming client library for RocketWelder services with zero-copy shared memory support |
|
|
RocketWelder.SDK.Blazor
Blazor components and decoders for RocketWelder streaming data (segmentation, keypoints). WASM-compatible rendering to ICanvas. |
|
|
BlazorBlaze.Server
Server-side extensions for BlazorBlaze including WebSocket streaming endpoints and IRemoteCanvas for server-rendered vector graphics. |
|
|
RocketWelder.SDK.Hmi
HMI overlay abstractions for the RocketWelder SDK (IUiSink, IUi, IUiLayer) layered over BlazorBlaze vector graphics. |
|
|
BlazorBlaze.Scene3D
Engine-agnostic 3D scene graph with geometry types, Camera3D, and ISceneRenderer interface for Blazor applications. No rendering engine dependency. |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.5.2 | 400 | 4/29/2026 |
| 1.5.1 | 175 | 4/27/2026 |
| 1.5.0 | 162 | 4/27/2026 |
| 1.4.4 | 159 | 4/27/2026 |
| 1.4.3 | 157 | 4/27/2026 |
| 1.4.2 | 164 | 4/25/2026 |
| 1.4.1 | 165 | 4/25/2026 |
| 1.4.0 | 157 | 4/25/2026 |
| 1.3.0 | 175 | 4/2/2026 |
| 1.1.16 | 203 | 3/28/2026 |
| 1.1.15 | 200 | 3/28/2026 |
| 1.1.14 | 218 | 3/28/2026 |
| 1.1.13 | 230 | 3/28/2026 |
| 1.1.12 | 176 | 3/27/2026 |
| 1.1.11 | 168 | 3/27/2026 |
| 1.1.10 | 173 | 3/27/2026 |
| 1.1.9 | 168 | 3/27/2026 |
| 1.1.8 | 175 | 3/27/2026 |
| 1.1.7 | 169 | 3/27/2026 |
| 1.1.6 | 174 | 3/27/2026 |