游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3172|回复: 6

再谈D3D8全屏显窗口,我有一方法

[复制链接]

65

主题

225

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
发表于 2004-3-10 20:01:00 | 显示全部楼层 |阅读模式
我使用下面这个函数来代替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;
}

37

主题

378

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2004-3-10 20:44:00 | 显示全部楼层

Re:再谈D3D8全屏显窗口,我有一方法

老大!!!你那个BitBlt我看了实在是有点发抖……D3D8本来是要直接控制硬件的,你可倒好,硬要用什么HDC,这样一来,你把D3D8的直接硬件控制给破坏了,反倒更慢了,优化的方法就是取消通过HDC渲染D3D。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-3-12 03:40:00 | 显示全部楼层

Re:再谈D3D8全屏显窗口,我有一方法

其实有一种非常简单的办法,A3 用的就是这种办法。

13

主题

145

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2004-3-12 14:01:00 | 显示全部楼层

Re:再谈D3D8全屏显窗口,我有一方法

什么简单的方法?介绍一下啊。

65

主题

225

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
 楼主| 发表于 2004-3-12 19:26:00 | 显示全部楼层

Re:再谈D3D8全屏显窗口,我有一方法

什么简单的方法啊?麻烦congy告之。

0

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2004-3-16 18:32:00 | 显示全部楼层

Re:再谈D3D8全屏显窗口,我有一方法

请教是什么方法?

13

主题

145

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2004-3-17 13:10:00 | 显示全部楼层

Re:再谈D3D8全屏显窗口,我有一方法

听说dx7里有个例子,谁有,能不能给我发一份,chena224504@163.com。
先谢了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-29 11:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表