2010-06-21 35 views
0

我試圖寫的代碼一小塊搶後備緩衝到像素陣列。我之前幾乎沒有使用過directX,因爲我更像是一名OpenGL粉絲。 我的願望是實際替換項目中的一些代碼,該代碼使用非常緩慢的BitBlt和DC抓取後緩衝器。
這應該在所有計算機上工作,這就是爲什麼我選擇了DirectX7的。
我的問題是......我該怎麼做?
謝謝。抓住後備緩衝與DirectX 7

回答

0

我要做的是使用一個輔助類做鎖定/如下解鎖。然後你使用它像這樣:

mBackBuffer->Flip(DDFLIP_WAIT); 

{ 
    DDSURFACEDESC2 ddsd; 
    ZeroMemory(&ddsd, sizeof(ddsd)); 
    ddsd.dwSize = sizeof(ddsd); 

    ReadLock r(mBackBuffer, ddsd, NULL /* for whole surface */); 

    if (r) 
    { 
     // ddsd.lpSurface contains the void* pointer to the bytes 
     // ddsd.lPitch contains the byte count of each horizontal line 
    } 

} // ReadLock當它超出範圍解鎖

class ReadLock 
{ 
    public: 
     ReadLock(IDirectDrawSurface7* surface, DDSURFACEDESC2& ddsd, LPRECT pRect = 0) : surface_(surface), mpRect(pRect), hr(S_OK) 
     { 
      hr = surface_->Lock(mpRect, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_NOSYSLOCK | DDLOCK_WAIT | DDLOCK_READONLY, 0); 
     } 

     HRESULT getResult() const { return hr; } 
     bool operator!() const { return FAILED(hr); } 
     operator bool() const { return SUCCEEDED(hr); } 

     ~ReadLock() 
     { 
      if (surface_ && SUCCEEDED(hr)) 
       surface_->Unlock(mpRect); 
     } 

    private: 
     HRESULT hr; 
     RECT* mpRect; 
     IDirectDrawSurface7* surface_; 
}; 
0

TBH DirectX 9的將與古卡甚至工作。你沒有所有可用的功能,但你有一個SHED加載更多有用的信息。雖然我認爲你可能在Win 95/9/me的支持上有點勉強,並贏得2K。請記住,NT4從來沒有像樣的DirectX版本。

唉我沒有DX7文檔的任何地方方便,但我敢肯定,你可以只得到後緩衝區表面,然後將其鎖定,以獲得數據。儘管您需要牢記抓取後臺緩衝區的速度有多慢,特別是在舊卡上。通過PCI或AGP總線將本地視頻內存中的後臺緩衝區複製到系統內存的速度非常慢。

究竟是你想達到什麼目的?必須有更好的方式來實現你是什麼後做......