Kann eine eigenständige WPF-Anwendung eine Schnittstelle erstellen, die wie eine Flash-Schnittstelle aussieht?

7

Es scheint, dass WPF als Antwort der Anwendung auf Adobe Flash erstellt wurde. Silverlight wird zum Erstellen von Webseiten verwendet. Kann dieselbe Funktionalität jedoch in eine eigenständige WPF-Anwendung übernommen werden? Mit Scaleform kann Flash in nicht verwalteten C ++ - Spielen verwendet werden. Kann WPF verwendet werden, um denselben Schnittstellentyp zu erstellen? Was ich gelesen habe, scheint mich glauben zu lassen, dass es möglich ist. Aber ich habe keine Blätter von Anwendungen gesehen, die diese Art von Schnittstelle zeigen.

zooropa
quelle
Ist definitiv spielbezogen, aber Sie können immer noch eine bessere Antwort auf stackoverflow.com
Iain

Antworten:

5

WPF wurde erstellt, um Windows-Entwicklern eine bessere Möglichkeit zum Erstellen von GUIs für Desktop-Anwendungen zu bieten. Silverlight wurde als Antwort auf Flash erstellt und verwendet die WPF-API weitgehend wieder, hat jedoch eine andere Implementierung.

Theoretisch könnten Sie WPF verwenden, um die GUI für ein Spiel zu erstellen, aber in der Praxis würden Sie wahrscheinlich nicht: -

  • Ihr Spiel hängt vom installierten .NET Framework ab. Das ist keine große Sache mehr, aber es ist noch eine Sache, sich Sorgen zu machen, dass es nicht funktioniert.
  • WPF verwendet Direct3D 9 zum Rendern. Es gibt eine Erweiterung, mit der Sie unter Vista / Win7 und XP SP3 oder höher eine Oberfläche zuweisen und zwischen WPF und Ihrer nicht verwalteten C ++ - Spiel-Engine freigeben können. Möglicherweise haben Sie Probleme mit DX10.1 oder 11.
  • Die .NET-Laufzeit unterbricht alle Threads, die während einer Garbage Collection in irgendeiner Weise mit dem verwalteten Speicher befasst sind. Um zu vermeiden, dass Ihre Spieleschleife angehalten wird, müssen Sie eine Methode zum Datenaustausch zwischen Ihrem nicht verwalteten Code und der .NET-Laufzeit entwickeln, die das Aufrufen der .NET-Laufzeit über Interop vermeidet. Wahrscheinlich verfügen Sie über einen gemeinsam genutzten Bereich mit nicht verwaltetem Speicher, auf den Sie mit umanaged Threading-Primativen zugreifen und den Sie synchronisieren können.
  • Hier ist jedoch das eigentliche Problem: Wenn Sie diesen Weg gehen würden, würden Sie die Kontrolle über Ihr Fenster an WPF übergeben. Sie müssen WPF nur mit einer D3D-Oberfläche versorgen, die Ihr endgültiges 3D-Rendering enthält, und diese zusammensetzen, bevor Sie sie präsentieren. Sie sind an den Aktualisierungsplan von WPF gebunden, und es gibt auch keine Möglichkeit, im Vollbildmodus zu arbeiten, wie dies bei 3D-Spielen normalerweise der Fall ist.

Es besteht jedoch die Möglichkeit, dass diese Situation gerettet werden könnte. Es gibt eine Open-Source-Neuimplementierung von .NET namens Mono. Sie haben ein Teilprojekt namens Moonlight, das eine Neuimplementierung von Silverlight ist. Wenn der Quellcode verfügbar ist, besteht die Möglichkeit, dass er ähnlich wie Scaleform integriert wird und Sie GUIs mit dem hervorragenden Authoring-Tool Expression Blend von Microsoft erstellen können. Ich glaube, noch hat niemand dies getan, daher gibt es wahrscheinlich Probleme, die aufgedeckt werden müssen, aber ich werfe es nur als Idee raus.

BEARBEITEN: Nachdem ich dies hinzugefügt hatte, kam mir der Gedanke, dass Sie vielleicht nicht so sehr daran interessiert sind, Authoring-Tools wie Flash Studio oder Expression Blend zu nutzen, und dass Sie einfach nur in der Lage sein möchten, schnell hochwertige 2D-Grafiken zu zeichnen. In diesem Fall gibt es die Direct2D-API , die Microsoft in Windows 7 hinzugefügt und dann auf Vista zurückportiert hat.

U62
quelle
Zu Ihrer Information, der Garbage Collector wurde in .NET 4 erheblich verbessert. Er unterstützt jetzt die Hintergrundsammlung aller drei Generationen von Objekten, aber ich weiß nicht, ob / wie sich die Änderungen auf Problem Nr. 3 in Ihrer Liste auswirken könnten. Wenn jemand weiß, bitte teilen :).
Mike Strobel
Mono und Moonlight sind MIT-lizenziert, daher ist es sicherlich machbar, einen oder beide in ein Spiel einzubetten (und dies wird beispielsweise in Second Life getan). Es gab mindestens einen geplanten Versuch, eine solche Einbettung von Moonlight selbst für ein Spiel durchzuführen : tirania.org/blog/archive/2009/Nov-12-2.html#comment-22844845 (Keine Ahnung, ob es passiert ist / erfolgreich war oder auch nicht.)
WorldMaker
1

Sie können definitiv ähnliche Arten von Schnittstellen in WPF erstellen, aber die Integration in ein Direct3D-Spiel ist problematisch. Sie können Direct3D-Inhalte in WPF (über D3DImage) hosten , aber Ihre 3D-Inhalte werden in die WPF-Anwendung integriert, sodass das Rendern von WPF abhängig wird. Infolgedessen kann es zu einer relativ schlechten Leistung kommen, da die Framerate von WPF begrenzt ist. Wie U62 in seinem Kommentar feststellte, kann WPF nur Direct3D 9-Inhalte hosten (im Gegensatz zu Direct3D 10/11). Möglicherweise können Sie dies jedoch umgehen, da IDirect3DDevice9ExRessourcen zwischen Geräten gemeinsam genutzt werden können. Daher können Sie möglicherweise ein freigegebenes Renderziel in Direct3D 10 oder 11 erstellen und es über ein Zwischengerät in WPF bringen IDirect3DDevice9Ex. Jeremiah Morrill diskutiert diese Technik hier .

Eine Alternative, obwohl alles andere als elegant, wäre das Rendern Ihrer WPF-Benutzeroberfläche in einem separaten Fenster mit Ebenen über dem Direct3D-Inhalt, wie hier beschrieben .

Es gibt auch Möglichkeiten, auf die interne Direct3D-Oberfläche von WPF zuzugreifen , mit der Sie WPF-Inhalte in einer externen Direct3D-Szene hosten können (anstatt umgekehrt). Dies ist jedoch ein ziemlich böser Hack und könnte durch zukünftige WPF-Versionen leicht gebrochen werden.

Natürlich nichts davon ist relevant , wenn Sie nicht wirklich brauchen , mit Direct3D zu interagieren. Spiele, die keine komplexen 3D-Grafiken erfordern, können sicherlich vollständig in WPF entwickelt werden . WPF verfügt über einige einfache 3D-Funktionen, die jedoch im Allgemeinen nicht für primitive Formen mit einfachen Texturen geeignet sind. Es werden auch benutzerdefinierte Pixel-Shader unterstützt, obwohl es viele Einschränkungen gibt (z. B. müssen es sich um Single-Pass-Effekte handeln).

Mike Strobel
quelle