调整交换链的大小会导致位图不可用(SharpDX,directX)



我想在我的 Windows 窗体应用程序上调整屏幕上的大小调整我的交换链。当我这样做时,我需要处理我的旧设备上下文、缓冲区、目标等......

看看下面的代码:

Public Overrides Sub Resize(Width As Integer, Height As Integer)
m_backBuffer.Dispose()
m_d2dContext.Dispose()
m_2dTarget.Dispose()

m_swapChain.ResizeBuffers(2, Width, Height, Format.R8G8B8A8_UNorm, SwapChainFlags.None)
m_backBuffer = m_swapChain.GetBackBuffer(Of Surface)(0)
Dim properties As BitmapProperties = New BitmapProperties(New SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.R8G8B8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied), 96, 96)
Dim dxgiDevice As SharpDX.DXGI.Device = m_device.QueryInterface(Of SharpDX.DXGI.Device)()
Dim d2dDevice As SharpDX.Direct2D1.Device = New SharpDX.Direct2D1.Device(dxgiDevice)
m_d2dContext = New SharpDX.Direct2D1.DeviceContext(d2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None)
m_2dTarget = New SharpDX.Direct2D1.Bitmap(m_d2dContext, m_backBuffer, properties)
m_d2dContext.Target = m_2dTarget
CType(m_Context, GpuDrawingContext).setRenderTarget(m_d2dContext)
End Sub

当我这样做时,问题是我之前创建的要在屏幕上显示的位图需要一个 DeviceContext 作为其创建的参数。但是,现在我正在实例化一个新的设备上下文来调整大小,当我想在 deviceContext 上绘制位图时,我收到错误 WrongFactory,因为它们不是使用我们想要从中绘制它们的相同 DeviceContext 创建的。

调整大小功能的任何解决方案?

你的代码似乎从根本上是错误的。在处理调整大小时,您实际上不需要调用任何内容,只需调用ResizeBuffers。而且您绝对不需要处理m_d2dContext,因为通常在应用程序的生命周期内保留相同的。代码的其余部分实际上属于帧呈现,通常在每次迭代时执行以下操作:

  • 获取后台缓冲区(请注意,不应对其进行缓存,因为在每个 Present 交换链之后将返回不同的后台缓冲区表面)
  • 为后台缓冲区图面创建 D2D 位图对象
  • 处理背缓冲液
  • 将此 D2D 位图对象设置为 D2D 设备上下文的渲染器
  • 处理 D2D 位图(它仍然处于活动状态,因为它被 DC 使用)
  • 开始抽奖
  • 画。。。
  • 结束抽奖
  • 重置 D2D 设备上下文呈现目标
  • 呈现新鲜框架

最新更新