冗長な状態変更の削除

旧バージョンのMicrosoft® Direct3D® 保持モードでは、ある呼び出しから次の呼び出しまでレンダリング状態と照明状態が変更されない可能性があることを考慮していなかった。この結果、保持モードは現在値と同じ値を設定するため、一般的なアプリケーションで冗長な状態変更が多数発生した。IDirect3DRMDevice3インターフェイスでは、パフォーマンスを向上させるため、こうした冗長な状態変更を解消するGetStateChangeOptionsLightStateChangeRenderStateChangeSetStateChangeOptionsメソッドが導入された。以上のメソッドを使用するには、以下の手順に従う。

  1. IDirect3DRMDevice3インターフェイスの2つのメソッドを使用して、冗長状態変更チェックをオンにする。これは、レンダリング状態や照明状態を変更する場合に、通知することを示す。
    Dev3->SetStateChangeOptions(D3DRMSTATECHANGE_RENDER, 0,
                                D3DRMSTATECHANGE_NONVOLATILE);
    Dev3->SetStateChangeOptions(D3DRMSTATECHANGE_LIGHT, 0, D3DRMSTATECHANGE_NONVOLATILE);
    
  2. 実行バッファまたはDraw Primitiveメソッドでレンダリング状態または照明状態を変更する場合、状態キャッシュを更新するために、Direct3D保持モードに変更を通知する必要がある。通知には2通りの方法がある。保持モードで状態を変更するか (冗長な変更は防止する)、状態を新しい値に変更したことを保持モードに通知する。どちらの場合もLightStateChangeおよびRenderStateChangeメソッドを使用する。

たとえば、次のコードは、テクスチャハンドルを変更して、状態キャッシュを更新する方法を示している。

Dev3->RenderStateChange(D3DRENDERSTATE_TEXTUREHANDLE, hTex, 0UL);

状態を変更して、保持モードに状態キャッシュを更新させるには、UPDATEONLYフラグを次のように使用する。

Dev3->RenderStateChange(D3DRENDERSTATE_TEXTUREHANDLE, hTex,
                        D3DRMSTATECHANGE_UPDATEONLY);

状態値を何度も変更するため、保持モードに現在値を追跡させたくない場合、次のコードに示すように、指定した状態に対する冗長状態チェックをオフに設定する。ただし、この方法はパフォーマンスが向上しないため推奨しない。

Dev3->SetStateChangeOptions(D3DRMSTATECHANGE_RENDER, D3DRENDERSTATE_TEXTUREHANDLE,
                            D3DRMSTATECHANGE_VOLATILE);

トップに戻る トップに戻る
© 1999 Microsoft and/or its suppliers. All rights reserved. Terms of Use.