2012-02-01 23 views
5

Quiero usar DirectX 11 desde código C++ no administrado y usar WFP para la GUI. SlimDX no es adecuado para mí. he encontrado la solución para hacer WPF trabajar con DirectX 10:WPF y DirectX 11 vía D3DImage

WPF & DirectX 10 via D3DImage

Pero no pude trabajar con DirectX 11. Sólo pantalla en blanco con dos botones. ¿Alguien sabe cómo hacer que WPF trabaje con DirectX 11.

También he visto que cuando estoy ejecutando este ejemplo, el uso de la CPU es de aproximadamente 4-5% para Intel i5 750 (Windows 7 64 bit, NVidia Geforce 430). Creo que es demasiado ... ¿Es posible disminuir el uso de la CPU?

Puede encontrar el código aquí: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/

+0

¿Recibe algún mensaje de error? ¿Puedes publicar tu configuración y código de renderizado? –

+0

Puede encontrar mi código aquí: http://www.gamedev.net/topic/619534-wpf-directx-11-via-d3dimage/ – Alex

Respuesta

1

No puedo comentar sobre cómo hacer el trabajo DirectX11 con ese ejemplo, pero la CPU 5% que estamos presenciando es, probablemente, el bucle se renderiza en DirectX girar pero sin Trabajo por hacer.

Un bucle de renderizado se usa comúnmente en juegos para renderizar "lo más rápido que puedas" mientras se actualiza la escena/física/IA en un hilo diferente. En las aplicaciones de visualización de escritorio esto generalmente no es necesario.

Para aplicaciones de visualización científica donde las actualizaciones de la GUI solo ocurren cuando el usuario interactúa (por ejemplo, arrastra un elemento, abre la ventana gráfica) he rediseñado el bucle de renderizado para que solo se visualice cuando hay una actualización. es decir: después de su trabajo para desplazarse por la ventana gráfica dentro del mousemove, fuerza a DirectX a volver a dibujar configurando un indicador o similar. De esta forma, "dibujar cuando lo necesite" reducirá su CPU a casi cero mientras la aplicación está inactiva y es más adecuada para aplicaciones de escritorio.

+0

Sí, tiene razón. Ahora WPF vuelve a dibujar ~ 60 fps. Puedo volver a dibujar solo por notificación. Pero si la GUI es más compleja que dos botones, el uso de CPU aumentará hasta un 10-15%, incluso si se vuelve a dibujar solo cuando lo necesite. – Alex

2

Falta una llamada a D3DImage.AddDirtyRect. Después de representar su escena con Direct3D11, necesita decirle a WPF que hay una nueva imagen lista para mostrarse. Para ello, se realiza lo siguiente, donde D3DImage es la instancia 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(); 

Esto tiene que ser hecho cada cuadro.

Additional info about AddDirtyRect

+0

No, lo hago en el archivo Window1.xaml.cs. He encontrado mi error. Utilicé un formato incorrecto para el diseño {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}. Usé DXGI_FORMAT_B8G8R8A8_UNORM, pero tengo que: DXGI_FORMAT_R32G32B32_FLOAT – Alex

3

que utiliza un formato incorrecto para el diseño de búfer de vértices. Usé DXGI_FORMAT_B8G8R8A8_UNORM, pero tengo que usar DXGI_FORMAT_R32G32B32_FLOAT en mi caso.

Cuestiones relacionadas