2017-06-27 3 views
0

Je souhaite redimensionner ma swapchain lors du redimensionnement de l'écran sur mon application de formulaire Windows. Quand je fais cela, je dois disposer mon plus deviceContext, tampon, cible etc ...Redimensionner swapchain provoque l'utilisation de bitmap (SharpDX, directX)

Regardez le code ci-dessous:

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 

Le problème quand je fais ça, est que le bitmap j'avais précédemment créé pour afficher sur l'écran besoin d'un DeviceContext en tant que paramètre pour leur création. Cependant, maintenant que j'instancie un nouveau DeviceContext lors du redimensionnement, j'obtiens l'erreur WrongFactory lorsque je veux dessiner le bitmap sur le deviceContext car ils ne sont pas créés avec le même DeviceContext d'où nous voulons les dessiner.

Des solutions pour la fonction de redimensionnement?

Répondre

0

Votre code semble être fondamentalement faux. Lorsque vous manipulez le redimensionnement, vous n'avez pas vraiment besoin d'appeler autre chose que ResizeBuffers. Et vous n'avez certainement pas besoin de vous débarrasser de m_d2dContext comme typiquement vous gardez le même pour la durée de vie de votre application. Le reste de votre code appartient réellement à l'image rendu, généralement à chaque itération vous effectuez les opérations suivantes:

  • obtenir backbuffer (notez qu'il ne doit pas être mis en mémoire cache car après chaque chaîne de swap présent sera de retour différente surface backbuffer)
  • créer l'objet bitmap d2d de surface backbuffer
  • disposer de backbuffer
  • ensemble cet objet bitmap d2d comme rendre targer de contexte de périphérique D2D
  • disposer de bitmap de D2D (il est encore en vie car il est utilisé par un courant continu)
  • commencent dessiner
  • tirage ...
  • fin dessiner
  • cible rendre contexte de dispositif de remise à zéro d2d
  • trame fraîche présente