2011-12-10 1 views
-1

에 의해 구현. 다음에 기대합니다.Direct3D를 VertexBuffer에 잠금() 및 잠금 해제() 함수는 IDirect3DVertexBuffer9이 방법</p> <pre><code>STDMETHOD(Lock)(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags) PURE STDMETHOD(Unlock)(THIS) PURE </code></pre> <p>나는 이러한 기능의 내부 구현을 모르는이 다른 D3DPOOL

  1. '잠금'방법은 VertexBuffer의 비디오 메모리를 ppbData에 매핑합니다. 그것은 많은 fater 성능을 얻는다.

  2. '잠금'방법은 시스템 mem을 할당하고 그것을 가리 키도록 ppbData를 만듭니다. 그리고 'UnLock'방법은 메모리를 실제 비디오 메모리에 복사하는 것입니다. 하드웨어에 추상화 레이어를 배치함으로써 이러한 접근 방식은 차이점을 제거합니다.

내가 그 생각 : 'D3DPOOL_SYSTEMMEM'모드 을, 그것은 'D3DPOOL_DEFAULT'모드 방법 2 에 의해 구현,이 방법 1.

/* Pool types */ 
typedef enum _D3DPOOL { 
    D3DPOOL_DEFAULT     = 0, 
    D3DPOOL_MANAGED     = 1, 
    D3DPOOL_SYSTEMMEM    = 2, 
    D3DPOOL_SCRATCH     = 3, 

    D3DPOOL_FORCE_DWORD    = 0x7fffffff 
} D3DPOOL; 

에 의해 구현하지만 난 몰라 모든 D3DPOOL 모드에서 어떻게 구현되는지. 전체 화면 장치가 초점을 잃고 장치 (D3DERR_DEVICENOTRESET 또는 D3DERR_DEVICELOST) "손실"될 때 ~~ D3DPOOL_DEFAULT에서

답변

3

을 도와, 버퍼 내용이 손실됩니다. 이 경우 버퍼 내의 데이터는 비디오 메모리에 저장 될 것으로 예상됩니다.

D3DPOOL_MANAGED에서 (비디오 메모리에 저장된) 데이터 복사본은 시스템 메모리에 저장되므로 드라이버가 장치를 잃어 버리면 복원됩니다.

D3DPOOL_SCRATCH는 정점 버퍼에 대해 지원되지 않습니다.

D3DPOOL_SYSTEMMEM은 시스템 메모리에서 비디오 메모리로이 정점 버퍼를 사용하기 위해 자주 데이터를 전송하기 때문에 더 나은 성능을 보장하지 않습니다. 자주 갱신되는 버퍼의 퍼포먼스를 높이기 위해서, D3DPOOL_DEFAULT에있는 동적 인 정점 버퍼 (D3DUSAGE_DYNAMIC, D3DLOCK_DISACRD, D3DLOCK_NOOVERWRITE를 참조)가있다. 또한, Direct3D9 문서에서는 시스템 메모리에 생성 된 리소스가 일반적으로 D3D9 장치에서 액세스 할 수 없다고 말합니다. 시스템 메모리에서 렌더링 할 때 순수 D3D9 장치에서 문제를 일으킬 수있는 DrawIndexedPrimitiveUP 및 DrawPrimitiveUP이 있습니다.

또한 두 플래그 중 하나가 생각한대로 작동하도록 보장 할 수는 없습니다. 상식을 통해 이러한 방식으로 작동해야한다고 말하면, 이것은 사양에 문서화되어 있지 않지만, Murphy의 법칙에 따르면, 아마도 그렇게하는 것이 효과가 없을 것입니다. 모든 실용적인 목적을 위해 드라이버 구현은 Direct3D 사양을 준수하는 한 미친 미친 사람에 의해 작성 될 수 있습니다.

다른 기능은 문서화 된 것입니다. DirectX SDK에는 Windows 시스템에서 읽을 수있는 * .chm 파일 (.HxI/.HxS)이 포함되어 있습니다. 여기에는 D3DPOOL에 대한 설명이 포함 된 online help on MSDN이 포함되어 있습니다. 이와 같은 질문을하는 경우 숙제를하지 않았고 문서를 읽지 않았습니다. 그러니 계속 읽어보십시오. Direct3D9 문서가 최신 SDK에 더 이상 포함되어 있지 않으면 이전 버전 (2004 년 여름) 만 가져옵니다.

관련 문제