|
我使用下面这个函数来代替Present函数,
成功的在D3D8全屏模式下显示出Windows窗口和输入法,
可惜速度太慢。
我的思路是:把BackBuffer换为HDC,然后用BitBlt函数。
请问我的思路可取吗?
哪位能帮我优化一下。
HRESULT DymPresent()
{
HRESULT hr;
LPDIRECT3DSURFACE8 pSurface=NULL,pFront=NULL;
hr=m_pd3dDevice->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&pSurface);
m_pd3dDevice->CreateImageSurface( 640, 480, m_d3dpp.BackBufferFormat, &pFront );
RECT rcSrc;SetRect( &rcSrc, 0, 0, 640-1, 480-1 ) OINT ptDst;ptDst.x = 0;ptDst.y = 0;
hr=m_pd3dDevice->CopyRects( pSurface, &rcSrc, 1, pFront, &ptDst );
DWORD* pBitmapBits;
BITMAPINFO bmi;
ZeroMemory( &bmi.bmiHeader, sizeof(BITMAPINFOHEADER) );
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 640;
bmi.bmiHeader.biHeight = -480;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biBitCount = 32;
// Create a DC and a bitmap
HDC hDCFront = GetDC(m_hWnd);
HDC hDC = CreateCompatibleDC( hDCFront );
HBITMAP hbmBitmap = CreateDIBSection( hDC, &bmi, DIB_RGB_COLORS,
(VOID**)&pBitmapBits, NULL, 0 );
// Lock the surface
D3DLOCKED_RECT d3dlr;
RECT rc;
SetRect(&rc,0,0,640,480);
hr=pFront->LockRect( &d3dlr, &rc, 0 );
if(d3dlr.pBits!=NULL)
{
if(m_d3dpp.BackBufferFormat==D3DFMT_X8R8G8B8 || m_d3dpp.BackBufferFormat==D3DFMT_A8R8G8B8)
{
DWORD* pDst16 = (DWORD*)d3dlr.pBits;
DWORD bAlpha;
for(int y=0; y < 480; y++ )
{
for(int x=0; x < 640; x++ )
{
bAlpha = *pDst16++;
pBitmapBits[640*y + x]=bAlpha;
}
}
}
else
{
WORD* pDst16 = (WORD*)d3dlr.pBits;
DWORD bAlpha;
for(int y=0; y < 480; y++ )
{
for(int x=0; x < 640; x++ )
{
bAlpha = *pDst16++;
DWORD Out;
int r=0,g=0,b=0;
r=(bAlpha)&0x1C;
g=(bAlpha>>5)&0x003F;
b=bAlpha>>11;
Out=(b<<19 | g<<10 |r<<3)|0x070307;
pBitmapBits[640*y + x]=Out;
}
}
}
}
pFront->UnlockRect();
HBITMAP OldBitmap=(HBITMAP)SelectObject( hDC, hbmBitmap );
BitBlt(hDCFront,0,0,640,480,hDC,0,0,SRCCOPY);
pFront->Release();
pSurface->Release();
SelectObject( hDC, OldBitmap );
DeleteObject( hbmBitmap );
DeleteDC( hDC );
return hr;
} |
|