Chcę rysować linie tak szybko, jak to możliwe. Z tego powodu zaimplementowałem metodę wykorzystującą InteropBitmap. Działa to całkiem dobrze. Kolejnym krokiem było porównanie z ShardDX. Zasadniczo, co chcę zrobić, to: Uruchomienie następującego kodu w BackgroundWorker. To informuje WPF o aktualizacji WIC. Dowiedziałem się, że ten kod (tworząc wszystkie potrzebne dla ShapeDX i linii rysowania) trwa około 10ms dłużej niż robi to samo przy użyciu InteropBitmap.Renderowanie SharpDX w WPF
Moje pytanie brzmi teraz, jak przyspieszyć? Czy mogę zmienić kod w jakiś sposób, że muszę tylko wywołać BeginDraw, tworzyć linie i EndDraw, nie zawsze robiąc całe to kodowanie/dekodowanie obrazu? Czy istnieje lepsze podejście?
var wicFactory = new ImagingFactory();
var d2dFactory = new SharpDX.Direct2D1.Factory();
const int width = 800;
const int height = 200;
var wicBitmap = new Bitmap(wicFactory, width, height, SharpDX.WIC.PixelFormat.Format32bppBGR, BitmapCreateCacheOption.CacheOnLoad);
var renderTargetProperties = new RenderTargetProperties(RenderTargetType.Default, new PixelFormat(Format.Unknown, AlphaMode.Unknown), 0, 0, RenderTargetUsage.None, FeatureLevel.Level_DEFAULT);
var d2dRenderTarget = new WicRenderTarget(d2dFactory, wicBitmap, renderTargetProperties);
var solidColorBrush = new SharpDX.Direct2D1.SolidColorBrush(d2dRenderTarget, SharpDX.Color.White);
d2dRenderTarget.BeginDraw();
//draw whatever you want
d2dRenderTarget.EndDraw();
// Memorystream.
MemoryStream ms = new MemoryStream();
var stream = new WICStream(wicFactory, ms);
// JPEG encoder
var encoder = new SharpDX.WIC.JpegBitmapEncoder(wicFactory);
encoder.Initialize(stream);
// Frame encoder
var bitmapFrameEncode = new BitmapFrameEncode(encoder);
bitmapFrameEncode.Initialize();
bitmapFrameEncode.SetSize(width, height);
var pixelFormatGuid = SharpDX.WIC.PixelFormat.FormatDontCare;
bitmapFrameEncode.SetPixelFormat(ref pixelFormatGuid);
bitmapFrameEncode.WriteSource(wicBitmap);
bitmapFrameEncode.Commit();
encoder.Commit();
ms.Seek(0, SeekOrigin.Begin);
// JPEG decoder
var decoder = new System.Windows.Media.Imaging.JpegBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
// Write to wpf image
_WIC = decoder.Frames[0];
// Tell WPF to update
RaisePropertyChanged("WIC");
bitmapFrameEncode.Dispose();
encoder.Dispose();
stream.Dispose();
Z:
System.Windows.Media.Imaging.BitmapFrame _WIC;
public System.Windows.Media.Imaging.BitmapSource WIC
{
get
{
return (System.Windows.Media.Imaging.BitmapSource)_WIC.GetAsFrozen();
}
}
oraz:
<StackPanel>
<Image Name="huhu1" Source="{Binding WIC}" />
</StackPanel>
Link do SharpDXElement jest uszkodzony. Zaktualizuj to. – BrainSlugs83
@ BrainSlugs83 - linki zostały zaktualizowane. –
Od 2017 roku mówią: 'Aktualny kod zestawu narzędzi w tym repozytorium przestał działać z najnowszą gałęzią SharpDX. – vines