我想尽快画线。出于这个原因,我使用 InteropBitmap 实现了一个方法。这很好用。下一步是与 ShardDX 进行比较。基本上我想做的是: 在 BackgroundWorker 中运行以下代码。这确实会通知 WPF 有关 WIC 的更新。我发现此代码(创建 ShapeDX 和绘制线所需的所有内容)比使用 InteropBitmap 执行相同的操作要长大约 10 毫秒。
我现在的问题很简单,如何加快速度?我能否以某种方式更改代码,使我只需要调用 BeginDraw、创建线条和 EndDraw,而不必总是执行所有这些图像编码/解码操作?或者有更好的方法吗?
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();
与:
System.Windows.Media.Imaging.BitmapFrame _WIC;
public System.Windows.Media.Imaging.BitmapSource WIC
{
get
{
return (System.Windows.Media.Imaging.BitmapSource)_WIC.GetAsFrozen();
}
}
和:
<StackPanel>
<Image Name="huhu1" Source="{Binding WIC}" />
</StackPanel>
最佳答案
SharpDX 工具包通过 Direct3D11 到 Direct3D9 共享纹理支持 WPF。它在 SharpDXElement 中实现类。
您可能无法按原样重用它,因为 Direct2D(您用来绘制的)可以与 Direct3D11.1 或 Direct3D10 互操作,而 SharpDX 使用 Direct3D11 来支持 WPF,因此您需要稍微调整一下解决方案位。
基本上您需要执行以下操作:
- 初始化 Direct3D(10 或 11.1)。
- 初始化 Direct2D。
- 创建支持 Direct2D 和 Shared 的 D3D 渲染目标标记(here 在 SharpDX 中是如何完成的)。
- 初始化Direct3D9 .
- 创建共享 texture .
- 将纹理绑定(bind)到 D3DImage .
别忘了调用D3DImage.AddDirtyRect当渲染目标的内容更新时。
从您提供的代码中不清楚您是否只对所有初始化进行一次,因此请尝试仅调用一次任何初始化代码并重用渲染目标 - 只需在每帧开始时将其清除即可。这是获得良好性能所必需的。
更新:SharpDX.Toolkit 已被弃用,不再维护。它被移动到一个单独的存储库。
关于c# - WPF 中的 SharpDX 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19480373/