5

GDIPlusで使用CachedBitmapsする場合、Windows ビデオの「ハードウェア アクセラレーション」を下げすぎると、DirectDrawが無効になるなど、グラフィックの破損が発生します。

ここに画像の説明を入力

ハードウェア アクセラレーションには 6 つのレベルがあります。

  • すべての加速を無効にする
  • 基本的なアクセラレーションを除くすべてを無効にします。(サーバーマシンのデフォルト)
  • すべての DirectDraw と Direct3D アクセラレーション、およびすべてのカーソルと高度なアクセラレーションを無効にする
  • すべてのカーソルと高度な描画アクセラレーションを無効にする
  • カーソルとビットマップの加速を無効にする
  • すべてのアクセラレーションが有効になっています (デスクトップマシンのデフォルト)

DirectDraw が無効になっている場合DrawCachedBitmap、GDI+ で使用するとグラフィックが破損します。DrawImage()DirectDraw が有効になっていない場合、低速の API を使用するのは簡単ですが、DirectDraw が無効になっていることを検出できるようにする必要があります。

DirectDrawが有効になっているかどうかをプログラムで確認するにはどうすればよいですか?


問題は、dxdiag がこれをどのように行うかです。

代替テキスト

こちらもご覧ください

KB191660 - DirectDraw または Direct3D オプションが利用できない (アーカイブ)

4

3 に答える 3

4

最新のDirectX SDKをダウンロードすると (古い SDK にも同様の例があるはずです)、DXDIAG 情報をクエリする例があります。

サンプルは (SDK Root)\Samples\C++\Misc\DxDiagReport にあります。

dxdiaginfo.cpp の注意すべきメソッド

CDxDiagInfo::CDxDiagInfo
CDxDiagInfo::Init
CDxDiagInfo::QueryDxDiagViaDll    
CDxDiagInfo::GetDisplayInfo

プログラムを実行すると、巨大な値のリストが出力されます。あなたが興味を持っている値はpDisplayInfo->m_szDDStatusEnglish

于 2010-11-15T03:51:48.477 に答える
0

レジストリで加速スライダーの値を確認できます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{'some hex string'}\0000\Acceleration.Level

Video通常、複数のエントリがあるため、おそらくすべてのフォルダをループする必要があります。

Acceleration.Level値

  • 5すべての加速を無効にします
  • 4基本的な加速を除くすべてを無効にします。(サーバーマシンのデフォルト)
  • 3すべてのDirectDrawおよびDirect3Dアクセラレーション、ならびにすべてのカーソルおよび高度なアクセラレーションを無効にします
  • 2すべてのカーソルと高度な描画アクセラレーションを無効にします
  • 1カーソルとビットマップのアクセラレーションを無効にする
  • 0すべてのアクセラレーションが有効になっています(デスクトップマシンのデフォルト)

アップデート:

これは、加速レベルをプログラムで変更/チェックすることに関する古いスレッドです。 http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/

于 2010-11-13T02:24:30.347 に答える
0

IDirectDraw インターフェイスにクエリを実行して、その動作を確認できます。ハードウェア アクセラレーションがオフになっていると失敗すると思いますが、GetCaps() または TestCooperativeLevel() をテストすることをお勧めします。

LPDIRECTDRAW lpdd7 = NULL; // DirectDraw 7.0

// first initialize COM, this will load the COM libraries
// if they aren't already loaded
if (FAILED(CoInitialize(NULL)))
   {
   // error
   } // end if

// Create the DirectDraw object by using the
// CoCreateInstance() function
if (FAILED(CoCreateInstance(&CLSID_DirectDraw,
                         NULL, CLSCTX_ALL,
                         &IID_IDirectDraw7,
                         &lpdd7)))
   {
   // error
   }


// now before using the DirectDraw object, it must
// be initialized using the initialize method

if (FAILED(IDirectDraw7_Initialize(lpdd7, NULL)))
{
    // error
}

lpdd7->Release();
lpdd7 = NULL; // set to NULL for safety

// now that we're done with COM, uninitialize it
CoUninitialize();

残念ながら、DirectDraw ドキュメントは SDK に含まれなくなりました。サンプルとヘッダー ファイルを取得するには、古いバージョンが必要になる場合があります。

于 2010-11-15T09:10:30.420 に答える