2012-02-01 13 views
5

Desidero utilizzare DirectX 11 dal codice C++ non gestito e utilizzare WFP per la GUI. SlimDX non è adatto a me. Ho trovato la soluzione per rendere WPF lavorare con DirectX 10:WPF e DirectX 11 tramite D3DImage

WPF & DirectX 10 via D3DImage

Ma non riuscivo a lavorare con DirectX 11. schermo Just blank con due pulsanti. Qualcuno sa come far funzionare WPF con DirectX 11.

Inoltre avevo visto che quando sto eseguendo questo esempio l'utilizzo della CPU è del 4-5% per Intel i5 750 (Windows 7 64 bit, NVidia Geforce 430). Penso che sia troppo ... È possibile ridurre l'utilizzo della CPU?

Potete trovare il mio codice qui: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

+0

Vengono visualizzati messaggi di errore? Puoi pubblicare il tuo setup e il codice di rendering? –

+0

Puoi trovare il mio codice qui: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/ – Alex

risposta

1

Non posso commentare su come rendere il lavoro DirectX11 con quell'esempio, ma la CPU 5% si sta assistendo è probabilmente il ciclo rendo in DirectX filatura ma senza lavoro da fare.

Un ciclo di rendering è comunemente utilizzato nei giochi per il rendering "il più velocemente possibile" mentre si aggiorna la scena/fisica/AI su un thread diverso. Nelle applicazioni di visualizzazione desktop questo di solito non è necessario.

Per le applicazioni di visualizzazione scientifica in cui gli aggiornamenti alla GUI si verificano solo quando l'utente interagisce (ad esempio trascina un oggetto, apre la finestra) Ho ridisegnato il ciclo di rendering per eseguire il rendering solo quando c'è un aggiornamento. vale a dire: dopo aver lavorato per eseguire il pan della finestra all'interno di mousemove, si forza a reindirizzare DirectX impostando un flag o simile. In questo modo "disegnare quando ne hai bisogno" ridurrà la CPU quasi a zero mentre l'applicazione è inattiva ed è più adatta per le applicazioni desktop.

+0

Sì, hai ragione. Ora WPF ridisegna ~ 60 fps. Posso ridisegnare solo tramite notifica. Ma se la GUI è più complessa di due pulsanti, l'utilizzo della CPU aumenta fino al 10-15%, anche se per ridisegnarlo solo quando ne ho bisogno. – Alex

2

Manca una chiamata a D3DImage.AddDirtyRect. Dopo aver reso la tua scena con Direct3D11, devi dire a WPF che c'è una nuova immagine pronta per essere mostrata. Per fare questo, è necessario eseguire quanto segue, dove D3DImage è l'istanza D3DImage:

d3dimage.Lock(); 

//... 
//your render code 
///... 

var surface = renderTexture.GetSurfaceLevel(0); 

d3dimage.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface.ComPointer); 

var rect = System.Windows.Int32Rect(0, 0, width, height); 

d3dimage.AddDirtyRect(rect); 

d3dimage.Unlock(); 

Questo deve essere fatto ogni fotogramma.

Additional info about AddDirtyRect

+0

No, lo faccio nel file Window1.xaml.cs. Ho trovato il mio errore. Ho usato il formato sbagliato per il layout {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}. Ho usato DXGI_FORMAT_B8G8R8A8_UNORM, ma devo: DXGI_FORMAT_R32G32B32_FLOAT – Alex

3

ho usato formato corretto per il layout vertex buffer. Ho usato DXGI_FORMAT_B8G8R8A8_UNORM, ma nel mio caso devo usare DXGI_FORMAT_R32G32B32_FLOAT.