游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4508|回复: 15

请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

[复制链接]

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2004-7-26 17:58:00 | 显示全部楼层 |阅读模式
用BltFast或Blt不闪烁
代码
Refresh_1()
{
        HWND hWnd = _Forms.Wnd();

        RECT dstRect = {0};
        GetClientRect(hWnd, &dstRect);
        //--copy from MFC
        ::ClientToScreen(hWnd, (LPPOINT)&dstRect);
        ::ClientToScreen(hWnd, ((LPPOINT)&dstRect)+1);

        RECT srcRect = {0, 0, _Forms.Width(), _Forms.Height()};
        srcRect.right = dstRect.right - dstRect.left;
        srcRect.bottom = dstRect.bottom - dstRect.top;

        //--
        HRESULT hr = _lpDDS_Primary->BltFast(dstRect.left, dstRect.top
                , _lpDDS_Buffer, &srcRect
                , DDBLTFAST_NOCOLORKEY
                );
        if (DDERR_SURFACELOST == hr) { hr = _lpDDS_Primary->Restore(); }
}

直接拷贝数据偶尔有闪烁(不厉害,但能看到)
代码
Refresh_2()
{
        HWND hWnd = _Forms.Wnd();
        int nWidth = _Forms.Width();
        int nHeight = _Forms.Height();
       
        RECT dstRect = {0};
        GetClientRect(hWnd, &dstRect);
        //--copy from MFC
        ::ClientToScreen(hWnd, (LPPOINT)&dstRect);
        ::ClientToScreen(hWnd, ((LPPOINT)&dstRect)+1);

        //--
        //--主表面指针
        WORD * dstBuffer = NULL;
        Win32DDSLocker dstLocker(_lpDDS_Primary);
        dstBuffer = (WORD *)dstLocker.Buffer();
        //--缓冲表面指针
        WORD * srcBuffer = NULL;
        Win32DDSLocker srcLocker(_lpDDS_Buffer);
        srcBuffer = (WORD *)srcLocker.Buffer();

        //--直接内存操作方法复制缓冲表面到主表面

        //--窗口客户区起点位置
        int cx = dstRect.left;
        int cy = dstRect.top;

        //--窗口客户区宽高
        int w = dstRect.right - dstRect.left;
        int h = dstRect.bottom - dstRect.top;

        int dstDx = (_Pitch/2 - w);
        int srcDx = (nWidth - w);

        //--偏移
        dstBuffer += (cy * Width() + cx);

        for (int y = 0; y < h; y++)
        {
                for(int x = 0; x < w; x++)
                {
                        *dstBuffer ++ = *srcBuffer ++;
                }

                dstBuffer += dstDx;
                srcBuffer += srcDx;
        }
}

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-26 18:01:00 | 显示全部楼层

Re: 请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

直接拷贝速度要快一点点,但我想直接拷贝的目的是有别的用途 [em7]

62

主题

296

帖子

302

积分

中级会员

Rank: 3Rank: 3

积分
302
QQ
发表于 2004-7-26 18:21:00 | 显示全部楼层

Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

为什么不拷贝到后台?有什么特殊用途吗?

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-26 18:23:00 | 显示全部楼层

Re: Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪

skice: Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

为什么不拷贝到后台?有什么特殊用途吗?


我就是要从后台往前台拷贝

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-26 18:24:00 | 显示全部楼层

Re: Re: Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶

数据都在后台准备好了,总有要放到前台的时候 [em10]

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-27 10:22:00 | 显示全部楼层

Re: 请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

能找到BltFast的源代码看看就OK了 [em1]

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2004-7-27 15:24:00 | 显示全部楼层

Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

我的不闪也是自己写的copy函数。楼主要不要?

2

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2004-7-27 17:45:00 | 显示全部楼层

Re: Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪

[em5]谢谢!
能贴上来吗?

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2004-7-27 18:23:00 | 显示全部楼层

Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

void CopyBlt(LPDIRECTDRAWSURFACE7 lpDDS_src,LPDIRECTDRAWSURFACE7 lpDDS_dest,int lpDD_srcX,int lpDD_srcY,int lpDD_destTopX,int lpDD_destTopY,int lpDD_destBottomX,int lpDD_destBottomY){
        ZeroMemory(&ddsd_src,sizeof(ddsd_src));
        ddsd_src.dwSize=sizeof(ddsd_src);
        ZeroMemory(&ddsd_dest,sizeof(ddsd_dest));
        ddsd_dest.dwSize=sizeof(ddsd_dest);
        lpDDS_src->Lock(NULL,&ddsd_src,DDLOCK_WAIT,NULL);
        lpDDS_dest->Lock(NULL,&ddsd_dest,DDLOCK_WAIT,NULL);
        BYTE *lPsrc=(BYTE*)ddsd_src.lpSurface;
        BYTE *lPdest=(BYTE*)ddsd_dest.lpSurface;
        int FirstPoint_src=lpDD_srcY*ddsd_src.lPitch+lpDD_srcX*4;
        int FirstPoint_dest=lpDD_destTopY*ddsd_dest.lPitch+lpDD_destTopX*4;
        int lpDD_destHeight=lpDD_destBottomY-lpDD_destTopY;
        int lpDD_destWidth=(lpDD_destBottomX-lpDD_destTopX)/2;
        _asm{
                mov eax,lPsrc
                add eax,FirstPoint_src
                mov ebx,lPdest
                add ebx,FirstPoint_dest
                mov edi,lpDD_destHeight
FirstLoop:
                push eax
                push ebx
                mov esi,lpDD_destWidth
SecondLoop:
                movq mm0,[ebx]
                movq [eax],mm0
                add ebx,8
                add eax,8
                dec esi
                jnz SecondLoop
                pop ebx
                pop eax
                add eax,ddsd_src.lPitch
                add ebx,ddsd_dest.lPitch
                dec edi
                jnz FirstLoop
                emms
        }
    lpDDS_src->Unlock(NULL);
        lpDDS_dest->Unlock(NULL);
}

1

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2004-7-27 18:42:00 | 显示全部楼层

Re:请教DX缓冲表面数据直接拷贝到主表面时屏幕偶尔闪烁?

页面切换就不会闪烁
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 11:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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