スタンドアロンのWPFアプリケーションでFlashインターフェイスのようなインターフェイスを作成できますか?


7

WPFは、AdobeのFlashに対するアプリケーションの回答として作成されたようです。Silverlightは、Webページの作成に使用されます。しかし、同じ機能をスタンドアロンのWPFアプリケーションに組み込むことができますか。 Scaleformを使用すると、アンマネージC ++ゲーム内でFlashを使用できます。WPFを使用して同じ種類のインターフェイスを作成できますか?私が読んだことは、それができると信じさせるようです。しかし、この種のインターフェースを示すアプリケーションのシートショットは見たことがありません。


間違いなくゲーム関連ですが、stackoverflow.comでより良い回答が得られる可能性があります
Iain

回答:


5

WPFは、Windows開発者がデスクトップアプリケーションのGUIを構築するためのより良い方法を提供するために作成されました。SilverlightはFlashへの回答として作成され、WPF APIの多くを再利用していますが、実装が異なります。

理論的には、WPFを使用してゲームのGUIを作成できますが、実際にはおそらく次のことは行いません:-

  • ゲームは、インストールされている.NETフレームワークに依存します。これは、それほど大した問題ではありませんが、機能しないことを心配する必要があります。
  • WPFはDirect3D 9を使用してレンダリングします。Vista / Win7およびXP SP3以降では、サーフェスを割り当て、WPFとアンマネージC ++ゲームエンジンの間で共有できる拡張機能があります。DX10.1または11に問題がある可能性があります。
  • .NETランタイムは、ガベージコレクション中にマネージメモリに何らかの方法で関与するすべてのスレッドを中断します。ゲームループの中断を回避するには、アンマネージコードと.NETランタイムの間でデータを交換する方法を考え、相互運用機能による.NETランタイムの呼び出しを回避する必要があります。おそらく、管理されていないメモリの共有領域があり、その両方に、UMAMANEDスレッドプリミティブを使用してアクセスし、同期することができます。
  • しかし、ここに本当の問題があります。このルートをたどると、ウィンドウの制御をWPFに引き継ぐことになります。最終的な3Dレンダリングを含むD3DサーフェスをWPFに提供し、それを提示する前に生成したものと合成します。WPFの更新スケジュールにロックされ、3Dゲームのようにフルスクリーンになる可能性もありません。

しかし、この状況が救われる可能性があります。Monoと呼ばれる.NETのオープンソースの再実装があります。彼らには、Silverlightの再実装であるMoonlightと呼ばれるサブプロジェクトがあります。ソースコードが利用可能であれば、Scaleformと同様の方法で統合でき、Microsoftの優れたExpression Blendオーサリングツールを使用してGUIを構築できる可能性があります。まだ誰もこれを行っていないと思うので、明らかにすべき問題があると思いますが、アイデアとしてそこに捨てています。

編集:これを追加した後、Flash StudioやExpression Blendなどのオーサリングツールを活用することにあまり関心がなく、高品質の2Dグラフィックスを高速に描画したい場合があることに気付きました。その場合、MicrosoftがWindows 7に追加し、次にVistaにバックポートしたDirect2D APIがあります。


参考までに、ガベージコレクターは.NET 4で大幅に改善されました。3世代すべてのオブジェクトのバックグラウンドコレクションをサポートするようになりましたが、変更がリストの問題#3に影響するかどうかはわかりません。誰かが知っている場合は、共有してください:)。
Mike Strobel、2010

MonoとMoonlightはMITライセンスなので、一方または両方をゲームに埋め込むことは確かに可能です(たとえば、Second Lifeで行われています)。ゲームムーンライト自体の、このような埋め込みを行う少なくとも1段の計画しようとしました:tirania.org/blog/archive/2009/Nov-12-2.html#comment-22844845は、(それが起こったノーアイデア場合/成功しましたただし、そうでない場合もあります。)
WorldMaker、

1

WPFでも同様の種類のインターフェイスを作成できますが、それらをDirect3Dゲームに統合するのは問題があります。WPF内で(を介してD3DImage)Direct3Dコンテンツをホストできますが、3DコンテンツはWPFアプリケーションに統合されるため、レンダリングはWPFに依存します。その結果、WPFのフレームレートによって制限されるため、パフォーマンスが比較的低下する可能性があります。また、U62が彼のコメントで述べたように、WPFは(Direct3D 10/11とは対照的に)Direct3D 9コンテンツのみをホストできます。ただし、IDirect3DDevice9Exデバイス間でリソースを共有できるため、これを回避できる場合があります。したがって、Direct3D 10または11で共有レンダーターゲットを作成し、中間IDirect3DDevice9Exデバイスを介してWPFに取り込むことができます。ジェレミア・モリルはこのテクニックについてここで論じています

ここで説明するように、代わりの方法は、エレガントではありませんが、Direct3Dコンテンツの上の別のレイヤー化されたウィンドウにWPF UIをレンダリングすることです

WPFの内部Direct3Dサーフェスアクセスする方法もあります。これにより、外部のDirect3DシーンでWPFコンテンツをホストできます(他の方法ではなく)。ただし、これはやや厄介なハックであり、将来のWPFリリースによって簡単に破られる可能性があります。

もちろん、実際にDirect3Dと相互運用する必要がない場合、これは関係ありません。複雑な3Dグラフィックスを必要としないゲームは、WPFで完全に開発できます。WPFにはいくつかの単純な3D機能がありますが、単純なテクスチャーを持つプリミティブシェイプ以外には一般的に不十分です。また、カスタムピクセルシェーダーもサポートしていますが、多くの制限があります(たとえば、シングルパスエフェクトでなければなりません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.