問題タブ [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.
c# - Direct3D (Transformation2D?) での効率的な線画
背景:私は DirectX 用の SlimDX C# ラッパーを使用しており、Sprite クラスを使用して多くの 2D スプライトを描画しています (従来は、基礎となる dll の Direct3DX 拡張から)。一度に数百のスプライトを画面に描画していますが、パフォーマンスは素晴らしいです。私のクアッド コアでは、10,000 以上のオブジェクトのロジックを含め、ゲーム全体でプロセッサの 3 ~ 6% を使用しています。 2 番目のスレッドのルーチンなど。明らかに、スプライトは完全なハードウェア アクセラレーションを使用して描画されており、すべてが本来あるべき状態になっています。
問題: Line クラスへの呼び出しを導入し始めたときに問題が発生します。(ドラッグ選択ボックス用に) 4 本の線を引くとすぐに、プロセッサの使用率が 13 ~ 19% に急上昇します。これでたったの4行!
私が試したこと:
- 線のアンチエイリアシングのオンとオフを切り替えます。
- GLines のオンとオフを切り替えます。
- 描画する呼び出しの周りで line.begin と line.end を手動で呼び出します。
- line.begin と line.end へのすべての呼び出しを省略します。
- line.draw への呼び出しが sprite.begin / sprite.end ブロック内にないことを確認します。
- sprite.begin / sprite.end ブロック内で line.draw を呼び出す。
- 4 ラインのレンダリング、または 300 のレンダリング。
- すべてのスプライトとテキストのレンダリングをオフにし、ライン レンダリングを 4 行だけ残します (これが何らかのモード変更の問題であるかどうかを確認するため)。
- 上記のほとんどの組み合わせ。
一般に、これらのいずれもパフォーマンスに重大な影響を与えませんでした。#3 では、プロセッサの使用率がおそらく 2% 減少しましたが、それでも、本来よりも 8% 以上高いままです。最も奇妙なことは、上記の #7 がパフォーマンスにまったく影響を与えなかったことです。4 行でも 300 行と同じくらい遅かったのです。私が把握できる唯一のことは、これが何らかの理由でソフトウェアで実行されているということです。および/または、グラフィックカードがある種の描画モードを継続的に切り替えていること。
マトリックスアプローチ:
誰かが上記の問題の修正を知っている場合は、それを聞いてみたいです!
しかし、これは一般的に directx 内の問題である可能性があると想定しているため、別のルートを追求してきました。つまり、独自のスプライト ベースのラインを作成することです。基本的に、1 ピクセルの白い画像があり、拡散色と変換を使用して線を描画しています。これはパフォーマンス的には機能します。このように 300 本の「線」を描画すると、クアッド コアで探している 3 ~ 6% のプロセッサ使用率のパフォーマンス範囲に収まります。
ピクセル ストレッチ ライン テクニックには 2 つの問題があります。変換について詳しい人が助けてくれることを願っています。水平線の現在のコードは次のとおりです。
これは、画面上のほぼ正しい位置にほぼ正しいサイズの線を描画する限り、機能します。しかし、物事が右にずれて見えるのは奇妙です。私のマトリックスアプローチがまったく正しいかどうかはよくわかりません.1x1のスプライトを水平方向にある量のピクセルでスケーリングし、垂直方向に別の量だけスケーリングしたいだけです. 次に、それらを配置できるようにする必要があります-中心点で問題ありません。それが私がしなければならないことだと思いますが、左上で配置できれば、さらに良いでしょう。これは単純な問題のように思えますが、行列に関する私の知識はかなり貧弱です。
これにより、純粋な水平線と純粋な垂直線が機能するようになり、これがほとんどの戦いです。それだけで生活でき、現在斜めの線を使用している場所に他の種類のグラフィックを使用できます. しかし、この引き伸ばされたピクセルのアプローチを使用して角度のある線を描く方法があれば、本当にいいと思います. つまり、たとえば 1,1 から 7,19 までの線を引きます。行列の回転などでは、これは実行可能のようですが、推測とチェック以外にどこから始めればよいかわかりません。これには永遠に時間がかかります。
どんな助けでも大歓迎です!
directx - ピクセル データをテクスチャからビットマップ (direct3d) にコピーする方法は?
シーンをテクスチャにレンダリングしてからビットマップに保存したいのですが、テクスチャをロックした後、ロック領域にピクセル データがないことがわかりました。テクスチャを画面に正しく表示できます。なぜかわからないのですが?1>フォーマットが間違っていますか?A8R8G8B8 が使用されています。2> ピクセル データを取得する前に、いくつかの重要な手順を見逃していませんか?
c# - C#wmvファイルからフレームを取得
DirectXをインストールせずにWindows2008(できるだけインストールしたくないWebサーバー)で作業せずに、C#を使用して位置Xのビデオ(.wmv)からフレーム/イメージを取得できるかどうかを誰かが知っていますか?
または、directxを使用した単純なソリューションでもよいでしょう。
ヘンク
c# - 64ビットウィンドウ上のDirectXアプリケーション
3DパーツがDirectX9で処理されるWPFアプリケーションを開発しています(WPFを使用すると十分な速度で実行されなかった多くの3D)。
問題は、アプリケーションが「任意のCPU」を構成としてリリースされ、ユーザーが64ビットウィンドウで実行すると、direcX部分がクラッシュすることです(System.BadImageFormatException)。どうやら、directX部分に含まれているdllは64ビットウィンドウでは使用できません。
これは、アプリケーションで使用する他の3番目の部分のdllで発生しましたが、ユーザーが64ビットWindowsマシンで実行している場合は、実行時にdllをx64用に構築されたdllに変更することで解決しました。x64用のDirectX9dllがどこにあるか知っている人はいますか?それらが存在する場合。
私が必要なものは次のとおりです。
- Microsoft.DirectX.Direct3D
- Microsoft.DirectX.Direct3DX
- Microsoft.DirectX
それらが存在しない場合、他の方法で問題を解決できますか?アプリケーションがClickOnceを介してリリースされ、構成を変更するとClickOnceが機能しなくなるため、構成をx86に変更できません(構成はClickOnceキーに含まれています)
私はWPFアプリケーションによってホストされているWinformsパーツを使用しており、winformsパーツは私が求めているDirectXdllを使用していることを付け加えておきます。これは、WPF:s 3Dを使用するよりも、WPFで多くの3Dメッシュを表示するためのはるかに優れた高速な方法でした。残念ながら、代わりにこの問題が発生しました。
c++ - Direct3D & iPhone 加速度計マトリックス
WinSock 接続を使用して、加速度計情報をオフにし、iPhone を Direct3D アプリケーションに取り込みます。Apples GLGravity のサンプル コードを修正して、ヘリコプタが重力に関連して動くようにしました。私はそのように加速度計の出力を制限しようとしました
これが機能しないように見えることを除いて!? 私が考えることができる唯一のことは、カスタム マトリックスを変更する必要があるということですが、何を変更する必要があるのか 理解できないようです。マトリックスは以下のコードです。
誰かが助けることができれば、それは大歓迎です!
input - XBox 360 コントローラーから入力を取得するにはどうすればよいですか?
XBox 360 コントローラーから入力を受け取る必要があるプログラムを作成しています。入力は、私が構築している RC ヘリコプターにワイヤレスで送信されます。
これまでのところ、これは DirectX の XInput ライブラリ、または XNA の Input フレームワークのいずれかを使用して実行できることを学びました。
他に利用可能なオプションがあるかどうか疑問に思っています。私のプログラムの範囲はかなり小さく、DirectX や XNA のような大規模なゲーム ライブラリをインストールする必要があるように思えます。さらに、このプログラムはマイクロソフト固有のものではなく、クロス プラットフォームであってほしいと思います。
Python のようなものでコントローラーの入力を取得できる簡単で軽量な方法はありますか?
いくつかのコメントに答えるために編集します。
ヘリコプターには合計 6 つのプロペラがあり、3 つの同軸ペアで配置されます。基本的にはこれと非常に似ていますが、15,000 ドルではなく約 1,000 ドルかかるだけです。オンボード処理には Arduino を使用し、ワイヤレス制御には Zigbee を使用します。
360コントローラーはデザインが良いので選びました。非常に人間工学的で、必要なすべての制御入力を備えています。ヘリコプターの制御に慣れている方は、左のジョイスティックでコレクティブを制御し、右のジョイスティックでピッチとロールを制御し、アナログ トリガーでヨーを制御します。アナログ トリガーは、360 コントローラーの大きな特徴です。PSおよび他のほとんどはそれらを持っていません。
プロジェクトの Web ページがありますが、まだかなりまばらです。設計全体を文書化する予定なので、最終的には興味深いものになるでしょう。
http://tricopter.googlecode.com
余談ですが、googlecode プロジェクトにブログ機能を持たせることで、Google を殺すことになるでしょうか?
可能であれば、360 コントローラーの入力プログラムを Linux と Windows の両方で実行したいと考えています。最終的には、コントローラーを組み込みマイクロコントローラー ボード (Arduino など) に直接接続して、コンピューターを経由する必要がないようにしたいと考えていますが、現時点では優先度は高くありません。
image - DirectX による大きな画像の表示が速くなりますか?
産業用ビジョン アプリケーションの開発者として、私は 6000x4000 ピクセル以上のかなりぎこちない画像をよく使用します。
カメラと画像処理が新しい画像の安定したストリームに取り組んでいる間 (そしてこの処理が主なタスクです)、ユーザーが他の画像を並行して快適に表示できるようにしたいと考えています。
プロセッサ (GDI など) でこれを行うと、パフォーマンスが大幅に低下します。たとえば、画像を分析するのに 0.2 秒かかりますが、1 回のズーム (コントロールに合わせてサイズを変更) で表示するには 0.8 秒かかります。
Photoshop では、グラフィック カードの非常に高速なメモリと処理の助けを借りて表示とズームが可能であるため、自分のコードでこれを実験できるかどうか、またその方法を誰かに教えてもらえないかと考えました。これは私の 76MB の rgb-data に相当しますか?) そして、ユーザーが操作するためにユーザーがコントロール/カードにズームして移動する手間をかけずに、何らかのコントロールに表示させます。
3D の外観は必要なく、2D-rgb-image で移動してサイズ変更するだけです。プロセッサの負荷が低く、高速で快適な表示を実現することを目的としています。
==>これは可能ですか(テクスチャなどとして)?==> >=256MB の現在のローエンド 3D カードに制限はありますか? ==> 誰かが予想される期間を提案できますか (データのコピー、ズーム)?
windows - DirectInput ライブラリの guidInstance に関する質問。デバイスの列挙も扱います
DIDEVICEINSTANCE の guidInstance について
マイクロソフトは次のように述べています。
デバイスのインスタンスの一意の識別子。アプリケーションは、インスタンスのグローバル一意識別子 (GUID) を構成ファイルに保存し、後で使用できます。インスタンス GUID は、特定のコンピューターに固有です。あるコンピューターから取得したインスタンス GUID は、別のコンピューターのインスタンス GUID とは無関係です。
デバイスをコンピューターに接続し、プログラムが列挙を実行して GUID を見つけた場合、再度列挙する必要はありますか? ユーザーがデバイスを抜き差しした場合でも。同じタイプの別のデバイスが接続されている場合、2 番目のデバイスが最初のデバイスと同じではないため、別の GUID が必要であることを引き続き認識しますか? プログラムがデバイスを見つけるために実行するたびにすべてのインターフェイスを再列挙する必要がありますか、それとも特定の PC に対して 1 回で十分ですか?
ありがとう。
multithreading - Windows ハンドルを使用して、bgnd スレッド セーフから DirectX 呼び出しを行っていますか?
アンマネージ コードの上にある (ほとんどの場合) Winforms UI であるアプリをデバッグしています。UI コードの一部は WinForms ではありません。DirectX を使用して、一部の Panel コンポーネントの表面に直接描画しています。そのために、コンポーネントの作成後にコンポーネントのウィンドウ ハンドルが記録され、この DirectX 表示を実行するモジュールが必要とするハンドル (GetWindowRect() など) を必要とする後続の呼び出しでは、このハンドルが使用されます。このメカニズムはしばらく前から存在していましたが、これから説明する問題は見られませんでしたが、運が良かっただけかもしれません。これを配置したプログラマーは、もう私には利用できません。
私が解決しようとしている問題は、非常に断続的に、この領域の表示が壊れることです。このルーチンは、バックグラウンド スレッドから呼び出されています。たとえば、GetWindowRect() の呼び出しが突然、描画の問題に付随してガベージ座標を返すことをアプリ ログで確認しました。Window ハンドル自体は破損しておらず、Windows データ構造を上書きしていないことは確かです。表示ストリームを停止して再開すると、GetWindowsRect() は同じ Windows ハンドルを使用して、適切な座標を再び返し始めます。
これが .NET レベルの場合は、Invoke を使用して描画をメイン スレッドに延期します。私の質問は、この DirectX 呼び出しに対して同じことを行う必要があるかどうかです。私は、バックグラウンド スレッドで描画しないことに関する Microsoft の警告を見つけようとしていました。誰でも私にこれを指摘できますか?
パソコン
c# - C# を使用して外部アプリケーションのスクリーンショットを撮る
私たちが起動した任意のアプリケーションのスクリーンショットを撮りたい C# (WPF) アプリケーションがあります (つまり、開始したプロセスへの参照があるため)。アプリケーションは最小化されているか、他のウィンドウの背後にある可能性がありますが、ピクセルの重なりではなく、個々のアプリケーションの画像のみが必要です。
BitBlt またはPrintWindowを使用した典型的な P/Invoke ソリューションがほとんどの場合機能することは知っていますが、グラフィック デバイスに直接描画する DirectX または OpenGL アプリケーションを処理する場合、それらは失敗します (黒/透明ピクセルしか得られません)。C# から Direct3D アプリのスクリーンショットを撮ることに関するこの記事を見つけたので、そのケースをカバーしたと思います。
だから私の質問はこれです:
- OpenGL アプリケーションでこれを行うにはどうすればよいですか?
- 使用する適切な方法 (PW/DX/GL) を決定する最も簡単な方法は何ですか?
- これを行うための単一の普遍的な方法はありますか?
#2 については、実行可能ファイルによってロードされたモジュールを検査し、DirectX または OpenGL DLL/アセンブリがロードされているかどうかを確認する必要がありますか?
これは Windows XP でのみ実行する必要があります (クロスプラットフォームではなく、このアプリケーションがすぐに Vista/7 に移行することはありません)。