問題タブ [direct2d]

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.

0 投票する
2 に答える
2991 参照

c++ - Windowsプログラミング:ID2D1Bitmapインターフェイス-ビットマップデータの取得

私は、いくつかの新しいDirect2DWindowsライブラリにアクセスするための独自の関数ライブラリを作成してきました。特に、私はID2D1Bitmapインターフェースに取り組んできました。ビットマップデータの先頭へのポインタを返す関数を作成したかった(特定のピクセルの編集、カスタムエンコーディング、または将来必要になる可能性のあるその他の機能)。残念ながら...先の問題...

ID2D1Bitmapインターフェイスから生のピクセルデータにアクセスする方法が見つからないようです。

誰かがこれにアクセスする方法を知っていますか?私の友人の1人は、ビットマップをサーフェスに描画し、そこからビットマップデータを抽出することを提案しました。これがうまくいくかどうかはわかりません。それは間違いなく非効率的で、どの種類の表面を使用すればよいかわかりません。

どんな助けでも大歓迎です。(特にC ++ですが、コードは言語間でそれほど変わらないと思います)

(ファイルから直接データを読み取ることができることはわかっていますが、WICデコーダーを使用しているため、判読できない形式がいくつもある可能性があります)

0 投票する
3 に答える
7032 参照

c# - Direct2DとDirectWriteが従来のCOMオブジェクトを使用しないのはなぜですか?

私はC#の小さな2Dゲームエンジンをいじっていて、レンダリングにDirect2DとDirectWriteを使用することにしました。Windows APIコードパックとSlimDXがあることは知っていますが、インターフェイスを最初から掘り下げて記述したいと思います。Managed C ++なしで実行しようとしていますが、Direct2DとDirectWriteは従来のCOMオブジェクトを使用していないようです。それらはから派生するインターフェイスを定義しますがIUnknown、COM相互運用機能を使用してC#から実際にそれらを使用する方法はないようです。にはIIDがありますd2d1.hが、CLSIDはありません。

もちろん、私はCOM相互運用機能を初めて使用するので、何かが足りないだけかもしれません。誰かがこの状況に光を当てることができますか?

0 投票する
1 に答える
1406 参照

windows - GDI でのピクセルごと、コンポーネントごとのアルファ ブレンディング

R、G、B カラー チャンネルを持つ 24 ビット ビットマップと、R、G、B アルファ チャンネルを持つ 24 ビット ビットマップがあります。最初のビットマップを GDI の HDC または Direct2D の RenderTarget にそれぞれアルファ チャネルでアルファ ブレンドしたいと考えています。たとえば、1 つのピクセルのビットマップ カラーが (192, 192, 192)、HDC カラーが (0, 255, 255)、アルファ チャネルが (30, 40, 50) であるとします。最終的な HDC カラーは (22, 245, 242) になります。最初に HDC をメモリ HDC に BitBlt し、各ピクセルの色を手動で計算してアルファ ブレンディングを行い、最後に BitBlt を戻すことができることを私は知っています。追加のブリッティングを避けて、API に仕事を任せたいだけです (カーネル空間にあるため、より高速です)。

最初に思いついたアイデアは、ソース ビットマップを赤のみ、緑のみ、青のみの 3 つの 8 ビット ビットマップに分割し、通常のアルファ ブレンディングを行ってから、3 つの出力ビットマップを HDC に合成することです。しかし、Windows でネイティブに分割と構成を行う方法が見つかりません (Direct2D レイヤーは役に立ちますか?)。また、分割と合成には、多くの追加コピーが必要になる場合があります。パフォーマンスのオーバーヘッドが高すぎます。

または、3 パスでアルファ ブレンディングを行うこともできます。各パスは、1 つのチャネルにブレンドを適用し、他の 2 つのチャネルは変更しません。

コメントありがとうございます。

編集:私はこの質問を見つけました。答えはこの問題への良い参考になるはずです。ただし、AC_SRC_OVER 以外にサポートされているブレンド操作はありません。Microsoft が API を改善しないのはなぜですか?

0 投票する
3 に答える
3770 参照

c++ - 未解決の外部シンボル

主な記事には、ヘッダーファイルソースファイルがあります。これらの2つのファイルをコピーし、いくつかのヘッダーを追加した後:

//安全な解放ファイル

このプロジェクトをコンパイルしようとすると、エラーが発生します。

エラー1エラーLNK2019:関数 "private:long __thiscall SimpleText :: CreateDeviceIndependentResources(void)"(?CreateDeviceIndependentResources @ SimpleText @@ AAEJXZ)で参照される未解決の外部シンボル__imp__DWriteCreateFactory @ 12

理由がわからない。全て?ヘッダーが含まれています。うまくいけば、あなたの何人かはこれを手伝うことができるでしょう。
ありがとうございました。

0 投票する
1 に答える
752 参照

c++ - Direct2D を使用した未解決の外部シンボル

hereから 'WIC Image Viewer ussign Direct2D' をダウンロードしてビルドしようとしていますが、ソリューションをビルドすると、次のような 56 個のエラーが表示されます。

  • エラー 1 エラー LNK2019: 関数 _wWinMain@16 WICViewerD2D.obj で参照されている未解決の外部シンボル __imp__CoUninitialize@0
  • エラー 2 エラー LNK2019: 関数 _wWinMain@16 WICViewerD2D.obj で参照されている未解決の外部シンボル __imp__DispatchMessageW@4
  • エラー 3 エラー LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が関数 _wWinMain@16 WICViewerD2D.obj で参照されています

等々。確かに、これは私の Visual Studio 設定の何かです。なぜなら、このコードはそのままで動作するはずではないからです。Windows SDK v7.0 がインストールされています。

0 投票する
1 に答える
1386 参照

msdn - シンプルな Direct2D アプリで fps を計算するにはどうすればよいですか?

ご覧いただきありがとうございます。MSDN から簡単な D2D アプリを作成しました。ここから入手できます。ここで、いくつかのプリミティブを描画し、fps カウンターを追加します。

長方形などを描画する OnRender() イベントがあります。また、RenderTarget->DrawText を呼び出す RenderTextInfo() への呼び出しもあります。1 秒あたりのフレーム数をカウントするロジックはどこに追加すればよいですか?

どうもありがとう。

0 投票する
5 に答える
13118 参照

c# - Direct2D / GDI+ と遅い Windows フォームの描画 - どうすればよいですか?

私は Visual Studio 2008、.NET C# 2.0 ~ 3.5、および Windows Forms を頻繁に使用していますが、GDI+ ではコントロールの描画が非常に遅いことに気付きました。私は画像 (JPG、GIF など) をあまり扱っていないことに注意してください。画像は、特定の場所のアイコンとしてのみ使用されます。これは実際には描画が遅いコントロール/フォーム/その他です。

問題は、コントロールが描画されているのを確認でき、一見簡単に見えるコントロールのセットが描画されるまでに数秒かかる場合があることです。つまり、その遅れと恐ろしい。

いくつかのラベル (40 ~ 50) をフォームに配置し、F5 キーを押して実行し、それらが描画されるのを待つ必要があるテストを行いました。繰り返しますが、ラグがあり、あまり良い経験ではありません。

したがって、この問題に対処する可能性のある WPF がありますが、私/私たちは WPF に移行する準備ができていません。そのため、回避策や修正を探していて、Direct2D に出くわし、他のライブラリを読んでいるときに見つけました。

私は少し困惑しているので、これらの質問をしてください:

1) まず、私が欲しいのは、GDI+ をより高速でハードウェア アクセラレーションされたアプローチに置き換えるための、かなりきちんとしたシンプルな方法です。WPF に移行せず、すべての Windows フォーム コードを書き直さなくても、それを行うことは可能ですか?

Direct2D で何かを読むときはいつでも、描画用のコードを手動で記述する方法を教えてくれる、通常はひどい C++ コードの長いブロックが表示されます。私はそれを望んでいません。

2) ネットで読んでいるときに、SlimDX に出くわしましたが、使い方がわかりません (書いている時点ではあまり試していません)。既に GUI アプリケーション (Windows フォーム、標準 C# コード) を持っているとしましょう。

私の問題は、既に作成した Windows Forms ソフトウェアで SlimDX、Direct2D、またはその他の類似のものを使用できるかどうか、また可能であればその方法を教えてくれる例やそのようなものが見つからないことです。

あいまいすぎないことを願っています=)

==編集== 2010-09-22

私は実際のアプリでいくつかのテストを行い、これに遅いものの1つを分離しました:

UserControl の一部のラベルにテキストを追加すると、テキストに合わせてコントロールのサイズが変更されます。たとえば、含まれている GroupControl は、ラベルの .Text プロパティに追加されたばかりのテキストのサイズに少し適応します。

約 10 個のラベル コントロールがあります。ラベルが初めて更新されてサイズが変更されると、プロセス全体に約 500 ミリ秒かかります。ラベルが 2 回目に更新され、サイズが変更されない場合、約 0 ミリ秒かかります。

==編集2== 2010-09-22

スローダウンの 1 つを見つけました。次に、文字列を Text-property に追加すると、追加されるテキストの文字列の長さが更新前のテキストと異なる場合、処理が遅くなります。

DevExpress ライブラリを使用しており、LabelControls を AutoSizeMode に設定できます。これを「なし」に設定すると、前のテキストとは長さが異なるテキストを追加するときにラグがなくなります。この問題は、AutoSize = true/false 設定もある通常の Label コントロールでも同じであると思います。

ただし、これは「回避策」ですが、それでも私の主張を証明しています。サイズ変更時に非常に遅く、かなり不自由です。

0 投票する
4 に答える
9624 参照

delphi - TDirect2DCanvas は遅いですか、それとも何か間違っていますか?

GDI に代わる代替手段を探している間、私はWindows 7 でDelphi の 2010 TDirect2DCanvasのパフォーマンスをテストしようとしていました。

Direct2D を使用して巨大なポリラインを描画してテストしたところ、GDI を使用して同じテストを実行した量の 500 分の 1 のデータでさえ、結果はとてつもなく遅くなりました (そして、GDI でバックバッファーとしてビットマップを使用することさえしませんでした。フォームキャンバスに直接描画しただけです)。

したがって、次のいずれかだと思います。a
) Direct2D は GDI より遅い。
b) TDirect2DCanvas が遅い。
c)私は何か間違ったことをしてい
ます。うまくいけば、それは c) です。

私が書いたテストコードは次のとおりです。

また、実際のコードで長いポリラインを描画したいと思っています。これは、私が取り組んでいるシステムが 2500 ポイントのポリライン (少なくとも 10K) を大量に描画する必要があるためです。

更新 (2010-11-06)

Direct2D がポリラインを好まないように思われることを以前に知りました。単一の線 (2 点のポリライン) を多く使用すると、より速く描画されます。

Chris Bensenのおかげで、アンチエイリアシングを使用しているときに大きなポリラインを使用すると速度が低下することがわかりました。そこで、Chris が提案したようにアンチエイリアシングを無効にすると、50k の線を描画するためにパフォーマンスが ~6000ms から ~3500ms になりました。

アンチエイリアシングを使用している間、Direct2D はポリラインを適切に処理しないため、まだ改善される可能性があります。アンチエイリアシングを無効にすると、まったく逆になります。

Direct2D で 50k の線を描画する時間は、アンチエイリアシングなしで大きなポリラインを描画した場合、約 50 ミリ秒です。いいね、えっ!

問題は、ビットマップに描画した場合、 GDI は Direct2D よりも高速であり、それが完了した後、結果をフォームに BitBlt で戻すと、 〜35msで描画され、同じグラフィックス品質で描画されます。また、Direct2D も既にバックバッファーを使用しているようです (EndDraw()呼び出されたときに描画するだけです)。

では、Direct2D の使用をスピード的に価値のあるものにするために、これを何らかの形で改善することはできますか?

更新されたコードは次のとおりです。

ちなみに、事前にジオメトリを作成するというChrisの提案を使用しても、速度はGDIとほぼ同じ速度ですが、それでも速くはありません.

私のコンピューターは Direct3D および OpenGL アプリを正常に実行しており、dxDiag の出力は次のとおりです: http://mydxdiag.pastebin.com/mfagLWnZ

この遅さの理由を誰かが説明してくれたらうれしいです。サンプルコードは大歓迎です。

0 投票する
1 に答える
387 参照

list - ランダムな数のD2D形状(長方形と楕円)を作成し、描画中にそれらを配列として参照するにはどうすればよいですか?

詳しく説明させてください。D2D長方形を次のように定義します。

および楕円は次のようになります。

これらの形状を描画するには、最初にそれらを変換して、rendertargetに渡します。

ランダムな数の長方形と楕円を作成し、それらを配列に格納して、それらを描画できるようにする方法が欲しいのですが。0から5までの乱数を返す関数があります。その番号を使用して、これらの形状を指す配列を作成し、それらを繰り返して画面に描画できるようにしたいと思います。この問題にどのように取り組むことができるかについてのアイデアはありますか?

0 投票する
2 に答える
4347 参照

c++11 - Direct2D DXGI サーフェスを作成できません

私はこのメソッドを呼び出しています:

http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx

呼び出しは で失敗しE_NOINTERFACEます。ドキュメントは、なぜこれが起こるのかについて特に役に立ちません。DirectX 11 のデバッグ機能をすべて有効にしましたが、これが最高です。私は有効なIDXGISurface1*(これも試したIDXGISurface) を持っており、他のパラメーターが正しく設定されていることを知っています。この呼び出しが失敗する理由についてのアイデアはありますか?

編集:

D3D11 デバイスの作成にも問題があります。D3D11CreateDeviceAndSwapChain で IDXGIAdapter* 引数として nullptr を渡すと正常に動作しますが、自分でアダプターを列挙してポインター (返される唯一のアダプター) を渡すと、無効な引数で失敗します。MSDN のドキュメントでは、nullptr が渡された場合、システムは EnumAdapters1 からの最初の戻り値を使用すると明示的に述べています。DX11 システムを実行しています。