2010-06-21 6 views
0

백 버퍼를 픽셀 배열에 집어 넣으려는 작은 조각의 코드를 작성하려고합니다. 저는 OpenGL 팬이 더 많기 때문에 간신히 directX를 사용했습니다. 내 목표는 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 다이렉트 X 9는 고대 카드에서도 작동합니다. 사용할 수있는 기능이 전부는 아니지만 SHED에서 더 유용한 정보를로드해야합니다. 나는 당신이 승리 95/9/me 지원에 조금 기진 맥진하고 2K를이기는 것 같지만. 마음에 NT4는 결코 DirectX의 적당한 버전을 가지지 않았다.

아아 나는 어디서나 DX7 문서를 가지고 있지는 않지만 꽤 뒤쪽의 버퍼 표면을 얻은 다음 데이터를 얻기 위해 잠글 수 있다고 확신한다. 비록 당신이 명심할 필요가 있지만, 백 버퍼를 잡는 것이 얼마나 느린지, 특히 오래된 카드의 경우. PCI 또는 AGP 버스를 통해 로컬 비디오 메모리에서 시스템 메모리로 백 버퍼를 복사하는 것은 대단히 느립니다.

달성하려는 목표는 무엇입니까? 당신이하고있는 것을 이루기 위해 더 나은 방법이 있어야합니다. ...

관련 문제