2010-06-21 33 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总线将本地视频内存中的后台缓冲区复制到系统内存的速度非常慢。

究竟是你想达到什么目的?必须有更好的方式来实现你是什么后做......