Ich weiß, die Terminologie dieser Frage muss alles falsch sein, aber bitte ertragen Sie mit mir und versuchen, Dinge aus der Sicht meiner Laien zu sehen (Ich habe keine Ausbildung in der Computertechnologie, ich bin ein Autodidakt Liebhaber von einer formalen Ausbildung in der Programmiersprache ist der Robotikclub meiner Schule).Gibt es eine Möglichkeit, eine DirectX12-Anwendung in einem WPF-Fenster zu hosten?
Was ich will, ist in der Lage, verwaltete DirectX 12 als "Hintergrund" meiner Anwendung, mit einer Spieleschleife und alle zu verwenden. Und, wenn möglich, um WPF-Steuerelemente wie eine Multifunktionsleiste oder eine Toolbox oder ein Menü rund um das eigentliche DirectX-Spiel zu haben. Ich habe überall im Internet gesucht und alles, was ich finde, ist sehr altes Zeug für Windows und DirectX 9.0; Ich hoffe, dass es heutzutage etwas Neues gibt.
tryed ich das Formular Ansatz Windows, die das ist im Grunde:
using System;
using System.Windows;
using System.Windows.Interop;
using Microsoft.DirectX.Direct3D;
using DColor = System.Drawing.Color;
public partial class MainWindow : Window
{
Device device;
public MainWindow()
{
InitializeComponent();
initDevice();
}
private void initDevice()
{
try
{
PresentParameters parameters = new PresentParameters();
parameters.Windowed = true;
parameters.SwapEffect = SwapEffect.Discard;
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
device = new Device(0, DeviceType.Hardware, windowHandle, CreateFlags.HardwareVertexProcessing, parameters);
}
catch(Exception e)
{
MessageBox.Show("initDevice threw an Exception\n" + e.Message, "ERROR", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void render()
{
device.Clear(ClearFlags.Target, DColor.LightGreen, 0f, 1);
device.Present();
}
}
keine Ausnahme ausgelöst wird, wird das Fenster überhaupt nicht wiedergegeben. Die Anwendung wird ausgeführt, das Fenster wird jedoch nicht angezeigt. Ich dachte nicht, dass das funktionieren würde, weil es keine Spielschleife gibt und render
nicht von irgendwo aufgerufen wird, aber ich habe nicht erwartet, dass das Fenster nicht einmal angezeigt wird. Wenn ich die Zeile initDevice() auskommentiere, wird das leere Fenster von WPF normal angezeigt
Dann werde ich das CompositionTarget.Rendering
-Ereignis einmal jedes Bild (oder Tick?) Aufgerufen, so dass der Handler für dieses Ereignis verwendet werden muss die Spieleschleife.
und ich versuchte, so folgt aus:
using System;
using System.Drawing;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Forms.Integration;
using Microsoft.DirectX.Direct3D;
using DColor = System.Drawing.Color;
using System.Windows.Forms;
public partial class MainWindow : Window
{
Device device = null;
MemoryStream stream;
PictureBox display;
WindowsFormsHost host;
public MainWindow()
{
InitializeComponent();
initDevice();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
private void CompositionTarget_Rendering(object sender, EventArgs e)
{
render();
}
private void initDevice()
{
try
{
PresentParameters parameters = new PresentParameters();
parameters.Windowed = true;
parameters.SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, display, CreateFlags.HardwareVertexProcessing, parameters);
stream = new MemoryStream();
device.SetRenderTarget(0, new Surface(device, stream, Pool.Managed));
}
catch(Exception e)
{
System.Windows.MessageBox.Show("initDevice threw an Exception\n" + e.Message, "ERROR", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void render()
{
device.Clear(ClearFlags.Target, DColor.LightGreen, 0f, 1);
device.Present();
display.Image = Image.FromStream(stream);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
host = new WindowsFormsHost();
display = new PictureBox();
host.Child = display;
mainGrid.Children.Add(host);
}
}
Noch kein Fenster angezeigt wird, auch wenn die Anwendung ausgeführt wird und abstürzt nicht.
Schließlich versuchte ich das gleiche, aber ohne CompositionTarget.Rendering
zu handhaben, aber mit einem DispatcherTimer stattdessen, und aufgerufen Rendern von innerhalb seiner Tick
Event-Handler. Gleiches Ergebnis: kein Fenster.
Kann mir jemand in die richtige Richtung zeigen?
Ich habe eine sehr leistungsfähige GPU und es wird gesagt, dass DirectX 12 die beste Leistung aller Zeiten aus einer Grafikbibliothek hat und ich wollte sehen, wie gut es wirklich ist. Vielen Dank für den Link, sieht vielversprechend aus. – FinnTheHuman
DirectX 12 hat das * Potenzial * für eine bessere CPU-seitige Leistung, aber es erfordert einen erheblichen technischen Aufwand, um dorthin zu gelangen. Die GPU-Funktionen sind für DX11 und DX12 identisch, wenn Sie Direct3D Hardware Feature Level 11.0 oder höher benötigen (DX12 hat keine Treiber für FL 9.x oder 10.x-Geräte). Im Allgemeinen sollten Sie DX11 bereits an den kritischen Punkt bringen, bevor es sinnvoll ist, zu DX12 zu wechseln, es sei denn, Sie haben ein großes Team von Grafikern, die die zusätzliche Kontrolle der DX12-API benötigen. Für Indies oder kleine Teams ist das Warten auf DX 12 eine Menge Arbeit. –
Das einzige, was ich gerne hätte Analog-Funktionalität für DX12 ist, dass ich es lernen will, nicht wie ich möchte Spiel mit ihm gerade jetzt. Also, wäre es gut, eine solche Kontrolle für DX12 zu haben. – Yola