C# 混合使用Direct2D和Direct3D(SlimDX)时Appcrash

C# 混合使用Direct2D和Direct3D(SlimDX)时Appcrash,c#,directx,direct2d,slimdx,direct3d10,C#,Directx,Direct2d,Slimdx,Direct3d10,在我的Direct3D 10.1应用程序中,我尝试混合使用D2D和D3D绘图代码。虽然绘图代码工作正常,但在不确定的时间(分钟,而不是小时)后,应用程序总是崩溃(在模块d3d11.dll中,代码为c0000005)。我已经在下面发布了代码的相关部分,请询问您是否希望看到任何其他位,我可以将它们添加到这个问题中 DeviceCreationFlags D3D10.DeviceCreationFlags deviceflags = D3D10.DeviceCreationFlags.BgraSupp

在我的Direct3D 10.1应用程序中,我尝试混合使用D2D和D3D绘图代码。虽然绘图代码工作正常,但在不确定的时间(分钟,而不是小时)后,应用程序总是崩溃(在模块d3d11.dll中,代码为
c0000005
)。我已经在下面发布了代码的相关部分,请询问您是否希望看到任何其他位,我可以将它们添加到这个问题中

DeviceCreationFlags

D3D10.DeviceCreationFlags deviceflags = D3D10.DeviceCreationFlags.BgraSupport; // Doesn't work without this flag
设备创建

SlimDX.Direct3D10_1.Device1.CreateWithSwapChain( null, D3D10.DriverType.Hardware, deviceflags, SlimDX.Direct3D10_1.FeatureLevel.Level_10_1, swapchaindesc, out device, out swapchain );
Direct2D初始化

        d2dFactory = new SlimDX.Direct2D.Factory(FactoryType.SingleThreaded);
        using (var backBuffer = SlimDX.Direct3D10.Resource.FromSwapChain<SlimDX.Direct3D10.Texture2D>(swapchain, 0))
        {
            d2dSurf = backBuffer.AsSurface();
            System.Drawing.SizeF dpi = d2dFactory.DesktopDpi;
            d2dRt = SlimDX.Direct2D.RenderTarget.FromDXGI(d2dFactory, d2dSurf,
                new SlimDX.Direct2D.RenderTargetProperties()
                {
                    Usage = SlimDX.Direct2D.RenderTargetUsage.None,
                    Type = SlimDX.Direct2D.RenderTargetType.Default,
                    PixelFormat = new SlimDX.Direct2D.PixelFormat(SlimDX.DXGI.Format.Unknown, SlimDX.Direct2D.AlphaMode.Premultiplied),
                });
            color = new SlimDX.Color4(Color.White);
            brush = new SlimDX.Direct2D.SolidColorBrush(d2dRt, color);
        }

提前谢谢

您是否使用相同的D3D设备进行Direct3D渲染?另外,您正在使用一个线程进行D2D和D3D渲染,对吗?您可以查看这些指南(尤其是备注部分)-是的,我使用的是相同的设备。我遵循那篇文章的所有指导方针。我上面发布的代码是根据那篇文章的片段编写的。请注意,我的代码工作正常,渲染效果良好,但在渲染数千帧后崩溃。是的,这可能导致线程并发问题。您没有回答您是否从一个线程执行D2D和D3D渲染,因为如果您使用两个线程(一个用于D2D渲染,另一个用于D3D渲染),则很可能需要保护/锁定循环(最精确地说是它们使用的资源)。无论如何,尽量减少你的代码。例如,关闭D2D/D3D渲染代码,看看是否会再次引发异常。对不起,这里有一个更详细的答案。是的,我所有的渲染都发生在一个线程上。当我关闭任一渲染时,都可以正常工作。只有当两者都渲染时,才会崩溃。
    private void Draw2D()
    {
        d2dRt.BeginDraw();

        // Drawing code here

        var hr = d2dRt.EndDraw();

        if (hr != SlimDX.Direct2D.ResultCode.Success)
            Console.WriteLine("EndDraw result: {0}", hr);
    }