我想尽快画线。因此,我使用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/

    10-08 22:22