[解決済み] CreateCompatibleBitmapおよびCreateDIBSection(メモリDCの場合)
質問
読んだ限りでは
こちら
Windows の GDI 関数のほとんどは高速化されているようです。そのため、たとえば
BitBlt
または
AlphaBlend
は、ハードウェアアクセラレーションが利用可能な場合に使用します。また、ウィンドウのコンテンツはビデオメモリにのみ保持されることにも言及しています。さて、これはすべて良いことであり
ウィンドウDC
しかし、どのように
メモリDC
ビデオカードのメモリに存在するものですか?また、それを達成した後、ピクセルへの直接アクセスを得るには、1.データをシステムメモリに一時的にコピーする 2.ピクセルデータを変更する 3.ビデオメモリにコピーバックする、ということになるかと思います。
2つのアプローチを試しましたが、どちらもタスクマネージャーで確認できるようにシステムメモリを割り当てました...
-
CreateCompatibleBitmap
HDC hDC = GetDC(NULL); m_hDC = CreateCompatibleDC(hDC); m_hBmp = CreateCompatibleBitmap(hDC, cx, cy); ReleaseDC(NULL, hDC); m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);
を呼び出し、ビットを取得します。
GetBitmapBits(...)
様々なコメントによると、これは確かにビデオメモリに互換性のあるビットマップを作成するはずですが、なぜ私はまだシステムメモリの増加を見ることができます(私が呼び出さなかった場合であっても
GetBitmapBits
)? -
DIBSectionの作成
HDC hDC = GetDC(NULL); m_hDC = CreateCompatibleDC(hDC); BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = cx; bmi.bmiHeader.biHeight = -cy; // top-down bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; m_hBmp = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&m_pBits, NULL, NULL); ReleaseDC(NULL, hDC); m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);
この場合、すぐにビットへのポインタを受け取ります (
m_pBits
ということは、これらはシステムメモリに存在することは明らかです。
それとも、両方のメソッドでシステムメモリに保持されるのはコピーなのでしょうか?しかし、もし私がシステム・メモリ内のビットを変更したら、そのビットは
BitBlt
の場合、再びシステムメモリからチェック/コピーする必要があります...あまり最適化されていないIMHO。
EDIT: メモリDCを作るのに
BeginBufferedPaint
と
GetBufferedPaintBits
. システムメモリも確保するので、その点では上記のメソッドのラッパーに過ぎないが、DCをキャッシュしているので、次の呼び出しで必ずしもメモリDCを再作成する必要はないだろう。Raymond Chen の
記事
.
EDIT #2:実際の問題は、そうなんでしょうね。 ハードウェアアクセラレーションによるGDI操作を得るために、私は方法1または2でメモリDCの作成を正しく行っていますか? 私にはすべて高速に見えますし、どちらの方法でも同じ速度が得られるので、それを確認する方法がないのです......。
解決方法は?
メモリDCはデバイス上に作成されるものではありません。GDI出力をメモリに格納するためのものです。
から メモリデバイスコンテキスト をMSDNで公開しています。
アプリケーションで出力をメモリ上に配置するには 実際のデバイスに転送するには、ビットマップ用の特別なデバイスコンテキストを使用します。 という操作を行うことができます。 メモリデバイスコンテキスト . メモリDCは システムは、メモリの一部を仮想デバイスとして扱えるようにします。
ハードウェアアクセラレーションによる2Dグラフィックスが必要な場合は Direct2D .
関連
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない