問題タブ [managed-directx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - SharpDX を使用して WPF で画像をスクロールするとアニメーションがぎくしゃくする
WPFアプリケーションでSharpDX経由でDirectX11を使用して、ウィンドウ全体でいくつかの画像をスムーズにスクロールしようとしています。
背景のビット:
画像は、ファイルから読み込まれ、テクスチャ配列として D3D に読み込まれた、時間によって変化するシグナル リターンであり、画像自体は一連のテクスチャ化された四角形 (非常に長い水平線内の一連の隣接する四角形) としてレンダリングされます。 )。ビューポートは、左端と右端が時間オフセットを表すように設定され、信号はこれらの時間の間にある期間表示されます。DirectX の実装は非常に単純です。クアッド頂点は一度生成され、フレームごとの非常に小さなバッファーには、現在の可視範囲/ズームなどに従ってスケールと変換を更新する単純な 2D ワールドビュー変換が含まれています。私が知る限り、D3D 実装はそうではありません。私が抱えている問題の一部 - それは実際には非常に単純なセットアップであり、非常に速くレンダリングされているようです (そうあるべきです)。
問題:
可視時間範囲がアニメーション化されている場合、画像のスクロールがスムーズではありません。画像は多くの場合「ジッター」し、率直に言って見栄えが悪い (ジッターがない場合は見栄えが良い)。
セットアップ:
DirectX は D3DImage にレンダリングされ、DX11 を機能させるために舞台裏で少し作業が行われます - このコードはhttps://sharpdxwpf.codeplex.com/から取得されます
グリッドに配置された複数の D3DImages (合計 4 つまで) があります (私は 2 つをテストしており、両方とも同じ期間の信号を含み、一緒にアニメーション化されています)。
これらの D3DImages は、ImageBrush のソースとして使用される DrawingVisual (カスタム FrameworkElement によってホストされる) によって描画されます。FrameworkElement オブジェクトは必要に応じてレンダリングをトリガーし、描画ビジュアルは D3D レンダリング呼び出しを処理し、D3DImage ブラシを使用してコントロールを埋める四角形を描画します。
時間範囲の値は、WPF の DoubleAnimation を使用してアニメーション化されます。現在表示されているビジュアルは、INotifyPropertyChanged を介してこの値にバインドされ、変更のたびに (InvalidateVisual を介して) レンダリングをトリガーします。
"Position" 値の変更 (可視時間範囲の開始) によってトリガーされる DrawingVisual レンダリング コード:
私が試したこと:
問題が不安定なレンダリング リクエストのタイミングによるものなのか、それとも問題がレンダリング プロセスのさらに先にあるのかを判断するために、さまざまなことを試しました (そして多くのことを検索しました)。
- CompositionTarget.Rendering へのフック まず、CompositionTarget.Rendering を介して位置値の更新を実行し、残りのプロセスはそのままにします (つまり、要素はこの値の変更に反応します)。
(言うまでもなく、これは非常に「テスト」コードです):
結果 - 単純な二重アニメーションより悪い。
- DispatcherTimer の使用。上記と同様に、タイマーとストップウォッチを組み合わせて使用すると、経過時間をもう少し正確に判断できます。興味深いことに、CPU 使用率が約 7% (コアの半分) から 0.7% に低下しました。
元の試みは、バリアント 1 と 2 とともに、すべて単一の値を更新しようとし、それによって関係者のレンダリングがトリガーされます。興味深いことに、レンダリング リクエストが Drawing ビジュアルに到達するまでの時間差をログに記録しました。実際には DisptacherTimer が最も一貫した結果をもたらしましたが (WPF アニメーションと CompositionTarget の両方で奇数フレームがドロップされました)、DisptacherTimer もアニメーションが最も不安定になりました。
画像を更新しますが、ビジュアルを無効にしません。ImageBrush のソースを更新すると、DrawingVisual を再レンダリングする必要なく、表示されるイメージが更新されます。この方法では、非常にぎくしゃくした結果が得られました。
フレームワーク要素自体の CompositionTarget.Rendering。これにより、ロットの中で最高の結果が得られましたが、まだ完全ではありません。ジッターが発生し、その後消散し、再び戻るだけです。このアプローチでは、DV を保持するフレームワーク要素が CompositionTarget.Rendering に接続し、ビジュアルが個別にアニメーション化されている現在の位置を照会します。私はこのアプローチでほとんど生きることができました。
画像を無効にする前に、D3D シーンがレンダリングされるまで待機を試みます (目に見える改善はありません)。
_scene.Renderer.Render(_draw_args);
_scene.Renderer.Device.ImmediateContext.End(q);while (!(_scene.Renderer.Device.ImmediateContext.IsDataAvailable(q))) Thread.Yield();
_image.Invalidate();
所見:
- これがパフォーマンスの問題だとは本当に思いません。私の開発マシンには優れたグラフィックス カード、8 i7 コアなどが搭載されており、これは単純なレンダリング操作です。
- これは、D3D と WPF レンダリングの間のある種の同期の問題のようですが、これを調査する方法がわかりません。
- 2 つの画像を並行してアニメーション化すると、(通常は) 2 つのうちの最初の画像でジッターがはるかに顕著になります。
- アニメーション中にウィンドウのサイズを積極的に変更すると、アニメーションは完全にスムーズになります (D3D コンテキストが常にサイズ変更されているため、多くの余分な作業が行われているにもかかわらず)。
編集
問題を切り分けるために、可能な限り元に戻しましたが、この問題は、D3DImage が WPF によって更新およびレンダリングされる方法の基本的なものであるようです。
表示される単純な三角形が画面全体にアニメーション化されるように、SharpDX サンプル ソリューションの WPFHost の例を変更しました。この例は、CompositionTarget.Rendering の DPFCanvas によってレンダリングされる DX10ImageSource でホストされます。
この例はこれ以上単純ではなく、WPF で D3DImage をレンダリングするときに得られる「金属に近い」ものです。レンダリング間の時間差から計算された値によって画面全体に変換された単一の三角形。なんらかの同期の問題であるかのように、スタッターが行き来します。それは私を困惑させますが、本質的にSharpDXをWPF内であらゆる種類のスムーズなアニメーションで使用できなくします。これは非常に残念です.
この問題の再現に興味のある方は、SharpDX サンプルをこちらから入手できます: https://github.com/sharpdx/SharpDX-Samples
WPFHost の例に次の簡単な変更を加えました。
およびシェーダー Simple.fx で:
directx - Directx 3D は、遠いオブジェクトが近いオブジェクトをカバーします
私は c# で DirectX を初めて使用しますが、私を混乱させる質問があります。基本的に、画面に 2 つの立方体をレンダリングしたいのですが、1 つはカメラから近く、もう 1 つはカメラから遠く離れています。近いものは常に遠いものの前にありますが、実際には、レンダリング シーケンスに依存し、最後にレンダリングされたものは常に他のものの前にあります。Z バッファーをクリアしようとしましたが、それは機能しませんすべてなので、私が間違っていることがあるかどうか疑問に思っていますか?
ここに私のコードスニペットがあります
c# - Managed DirectX を置き換える方法は?
古いプロジェクトに問題があります...短い場合-「Microsoft.DirectXを使用する」。それらは廃止され、最近では新しい PC でゲームを実行すると、とにかく以前には存在しなかったさまざまな不具合やトラブルが発生しました。それらは廃止され、サポートされなくなったため、すべてのアプリケーション コードを失うことなく gfx エンジンを置き換える良い方法の解決策を探しています。たとえば、古い XNA プロジェクトは、アーキテクチャに一般的な変更を加えることなく、MonoGame または FNA に移植できます。同じ方法で行う必要があります。ここで、API によって管理された directX に近いフレームワークで、それらを移植するための多くの苦労はありませんか? シャープDX? スリムDX? 他の?(SharpDX や SlimDX の経験はありません)
これが私のGFXコードに関するスニペットです。想像してみてください。これらは Managed DirectX に基づいています。
c# - 円を描く C# Directx
Managed DirectX を使用して C# で 2D 円を描画しようとしています。(はい、それは時代遅れであり、サポートされていません、私は知っています)
Web で見つけたすべての例は C++ です。彼らは、私の C# ライブラリにはないように見える D3DTLVERTEX のようなものを使用します。Directx C++ を Directx C# に変換する方法は、構文的に非常に異なるように見えるため、見当がつきません。
この簡単な方法を使用して、C# で四角形を描画しています
私は何度も円を描こうとしましたが、成功しませんでした。円が塗りつぶされているか、円の輪郭だけであるかは問題ではありません。ありがとう。