WPFでペイントのようなアプリケーションを作成しています。そこにレイヤー、歴史、エフェクトオプチンなどが欲しいです。ただし、Canvas / InkCanvasを使用した標準的なアプローチは、複雑な画像には遅すぎると思います。XNAプロジェクトを作成し、それをWPFアプリケーションに埋め込んで、最新のGPUの能力を使用することを検討します(xnaプロジェクトはキャンバススペースを描画するようなものです)。悪い考えではないですか?1つのプロジェクトでWPFとXNAの間で通信することは可能ですか?
1 に答える
これは悪い考えです。いくつかの理由:
WPFには、独自のハードウェアアクセラレーションが組み込まれています(ここを参照)。ハードウェアアクセラレーションを取得するためにXNAを使用する必要はありません。
XNAは、リアルタイム3Dレンダリング用に設計されています。ピクセル操作はその弱点です。ピクセルを直接読み書きすることで、パフォーマンス上の利点のほとんどが失われます。XNAのレンダリングターゲットが「失われる」可能性があるため、高価なピクセル読み取りを回避するのは難しいことに注意してください。
XNAを使用すると、合成レイヤーのパフォーマンスが向上します(ただし、これにWPFを使用することもできます)。これにより、大きなフルイメージ効果を適用するためのパフォーマンスが向上します。ただし、CPUでのみ合理的に実行できるフルイメージ効果の種類がいくつかあります。
XNAは、最大テクスチャサイズ、ターゲットプラットフォームのハードウェア機能などに制限を課します。
おそらく、思ったほどのパフォーマンスは必要ありません。XNAは、毎秒60フレームの連続で実行されるゲームに使用します。画像エディタは、それほど高速である必要はありません。フルイメージエフェクトの操作には、比較的長い時間がかかる場合があります。インタラクティブなペイント操作では、画像全体を一度に更新する必要がないため、CPUでも高速になります。
最後の質問に答えるために-はい、XNAをWPFに埋め込むことができます。トリッキーですが、些細なアプローチでは、XNAからWPFへの非常に遅いバッファーコピーが必要になります。これは、それを迅速に行うと主張するプロジェクトです。