游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9450|回复: 12

能提高D3DXLoadSurfaceFromSurface的执行速度?

[复制链接]

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2006-5-31 17:51:00 | 显示全部楼层 |阅读模式
        IDirect3DSurface9 *pBackSurface=NULL;
        IDirect3DSurface9 *pLockSurface=NULL;

        m_D3DDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackSurface);
        D3DSURFACE_DESC pDesc;
        pBackSurface->GetDesc(&pDesc);
        m_D3DDev->CreateOffscreenPlainSurface(pDesc.Width,pDesc.Height,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pLockSurface,NULL);
             执行这段代码的时候,CPU达到100%啦!!
              D3DXLoadSurfaceFromSurface(pLockSurface, NULL, NULL, pBackSurface, NULL, NULL, D3DX_FILTER_NONE, 0);

        if (pBackSurface) pBackSurface->Release();
        if (pLockSurface) pLockSurface->Release();

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-5-31 18:13:00 | 显示全部楼层

Re:能提高D3DXLoadSurfaceFromSurface的执行速度?

这个函数是用CPU来进行表面复制和转换的,当然速度慢了,如果想提高速度就用StretchRect,它会调用GPU硬件来做这些操作,当前限制也会很多啦,比如像素格式、纹理用途、缓冲池格式等的搭配都有很严格的要求

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-5-31 21:47:00 | 显示全部楼层

Re: 能提高D3DXLoadSurfaceFromSurface的执行速度?

谢谢(jk20012001)的回复。D3DXLoadSurfaceFromSurface函数处理速度慢,是否和内存的位置有关系呢?如果Surface都位于Video RAM或System RAM处理速度就会快呢?

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-6-1 10:57:00 | 显示全部楼层

Re:能提高D3DXLoadSurfaceFromSurface的执行速度?

不会的,因为它完全是用CPU来处理,而CPU访问Video Memory的速度更慢,所以……

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-6-1 10:58:00 | 显示全部楼层

Re:能提高D3DXLoadSurfaceFromSurface的执行速度?

如果需要转换的两种纹理格式硬件都支持,尽量还是用StretchRect,可以参考SDK对应的配对原则

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-6-1 11:34:00 | 显示全部楼层

Re: 能提高D3DXLoadSurfaceFromSurface的执行速度?

测试的时候发现一些问题!
测试代码如下:
        IDirect3DSurface9 *pBackSurface=NULL;
        IDirect3DSurface9 *pLockSurface=NULL;

        //m_D3DDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackSurface);
        m_D3DDev->GetRenderTarget(0, &pBackSurface);
        D3DSURFACE_DESC pDesc;
        pBackSurface->GetDesc(&pDesc);
        D3DDISPLAYMODE d3ddisplaymode;
        m_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);
        char strInfo[512];
        DWORD m_iCount = GetTickCount();
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"----------------------Begin:%d\n",0);
        OutputDebugStringA(strInfo);               
                                                                                                                                                                        // D3DPOOL_DEFAULT  D3DPOOL_SYSTEMMEM
        m_D3DDev->CreateOffscreenPlainSurface(pDesc.Width,pDesc.Height,d3ddisplaymode.Format,D3DPOOL_SYSTEMMEM,&pLockSurface,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"CreateOffscreenPlainSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        RECT m_Rect;
        SetRect(&m_Rect,0,0,pDesc.Width,pDesc.Height);
        //m_D3DDev->StretchRect(pBackSurface,&m_Rect,pLockSurface,&m_Rect,D3DTEXF_NONE);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //m_D3DDev->StretchRect(pBackSurface,NULL,pLockSurface,NULL,D3DTEXF_LINEAR);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //D3DXLoadSurfaceFromSurface(pLockSurface, NULL, NULL, pBackSurface, NULL, NULL, D3DX_FILTER_NONE, 0);
        m_D3DDev->GetRenderTargetData(pBackSurface,pLockSurface);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"-D3DXLoadSurfaceFromSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        D3DLOCKED_RECT d3dlr;
        if (D3D_OK == pLockSurface->LockRect(&d3dlr,NULL,D3DLOCK_DONOTWAIT))//D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_DONOTWAIT|D3DLOCK_NOOVERWRITE|D3DLOCK_READONLY))
        {
                memset(strInfo,0,sizeof(strInfo));
                sprintf(strInfo,"-------------------LockRect:%d\n",GetTickCount() - m_iCount);
                OutputDebugStringA(strInfo);

                pLockSurface->UnlockRect();
        }

        D3DXSaveSurfaceToFile(TEXT("f:\\test555.bmp"),D3DXIFF_BMP,pLockSurface,NULL,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"------------------------End:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        if (pBackSurface) pBackSurface->Release();
        if (pLockSurface) pLockSurface->Release();

输出信息为:
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:109
-------------------LockRect:109
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:125
-------------------LockRect:125
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:125
-------------------LockRect:125
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:109
-------------------LockRect:125
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:110
-------------------LockRect:125
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:109
-------------------LockRect:109
------------------------End:109
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:109
-------------------LockRect:109
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:125
-------------------LockRect:125
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:109
-------------------LockRect:109
------------------------End:109
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:110
-------------------LockRect:125
------------------------End:125
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:109
-------------------LockRect:125
------------------------End:125

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-6-1 11:36:00 | 显示全部楼层

Re: 能提高D3DXLoadSurfaceFromSurface的执行速度?

测试代码为:(创建页面的时候为D3DPOOL_DEFAULT)
        IDirect3DSurface9 *pBackSurface=NULL;
        IDirect3DSurface9 *pLockSurface=NULL;

        //m_D3DDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackSurface);
        m_D3DDev->GetRenderTarget(0, &pBackSurface);
        D3DSURFACE_DESC pDesc;
        pBackSurface->GetDesc(&pDesc);
        D3DDISPLAYMODE d3ddisplaymode;
        m_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);
        char strInfo[512];
        DWORD m_iCount = GetTickCount();
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"----------------------Begin:%d\n",0);
        OutputDebugStringA(strInfo);               
                                                                                                                                                                        // D3DPOOL_DEFAULT  D3DPOOL_SYSTEMMEM
        m_D3DDev->CreateOffscreenPlainSurface(pDesc.Width,pDesc.Height,d3ddisplaymode.Format,D3DPOOL_DEFAULT,&pLockSurface,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"CreateOffscreenPlainSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        RECT m_Rect;
        SetRect(&m_Rect,0,0,pDesc.Width,pDesc.Height);
        //m_D3DDev->StretchRect(pBackSurface,&m_Rect,pLockSurface,&m_Rect,D3DTEXF_NONE);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //m_D3DDev->StretchRect(pBackSurface,NULL,pLockSurface,NULL,D3DTEXF_LINEAR);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //D3DXLoadSurfaceFromSurface(pLockSurface, NULL, NULL, pBackSurface, NULL, NULL, D3DX_FILTER_NONE, 0);
        m_D3DDev->GetRenderTargetData(pBackSurface,pLockSurface);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"-D3DXLoadSurfaceFromSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        D3DLOCKED_RECT d3dlr;
        if (D3D_OK == pLockSurface->LockRect(&d3dlr,NULL,D3DLOCK_DONOTWAIT))//D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_DONOTWAIT|D3DLOCK_NOOVERWRITE|D3DLOCK_READONLY))
        {
                memset(strInfo,0,sizeof(strInfo));
                sprintf(strInfo,"-------------------LockRect:%d\n",GetTickCount() - m_iCount);
                OutputDebugStringA(strInfo);

                pLockSurface->UnlockRect();
        }

        D3DXSaveSurfaceToFile(TEXT("f:\\test555.bmp"),D3DXIFF_BMP,pLockSurface,NULL,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"------------------------End:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        if (pBackSurface) pBackSurface->Release();
        if (pLockSurface) pLockSurface->Release();
输出信息为:
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:218
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:234
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:234
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:218
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-6-1 11:41:00 | 显示全部楼层

Re: 能提高D3DXLoadSurfaceFromSurface的执行速度?

测试代码为:(使用StretchRect)
        IDirect3DSurface9 *pBackSurface=NULL;
        IDirect3DSurface9 *pLockSurface=NULL;

        //m_D3DDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackSurface);
        m_D3DDev->GetRenderTarget(0, &pBackSurface);
        D3DSURFACE_DESC pDesc;
        pBackSurface->GetDesc(&pDesc);
        D3DDISPLAYMODE d3ddisplaymode;
        m_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);
        char strInfo[512];
        DWORD m_iCount = GetTickCount();
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"----------------------Begin:%d\n",0);
        OutputDebugStringA(strInfo);               
                                                                                                                                                                        // D3DPOOL_DEFAULT  D3DPOOL_SYSTEMMEM
        m_D3DDev->CreateOffscreenPlainSurface(pDesc.Width,pDesc.Height,d3ddisplaymode.Format,D3DPOOL_DEFAULT,&pLockSurface,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"CreateOffscreenPlainSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        RECT m_Rect;
        SetRect(&m_Rect,0,0,pDesc.Width,pDesc.Height);
        m_D3DDev->StretchRect(pBackSurface,&m_Rect,pLockSurface,&m_Rect,D3DTEXF_NONE);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //m_D3DDev->StretchRect(pBackSurface,NULL,pLockSurface,NULL,D3DTEXF_LINEAR);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //D3DXLoadSurfaceFromSurface(pLockSurface, NULL, NULL, pBackSurface, NULL, NULL, D3DX_FILTER_NONE, 0);
        //m_D3DDev->GetRenderTargetData(pBackSurface,pLockSurface);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"-D3DXLoadSurfaceFromSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        D3DLOCKED_RECT d3dlr;
        if (D3D_OK == pLockSurface->LockRect(&d3dlr,NULL,D3DLOCK_DONOTWAIT))//D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_DONOTWAIT|D3DLOCK_NOOVERWRITE|D3DLOCK_READONLY))
        {
                memset(strInfo,0,sizeof(strInfo));
                sprintf(strInfo,"-------------------LockRect:%d\n",GetTickCount() - m_iCount);
                OutputDebugStringA(strInfo);

                pLockSurface->UnlockRect();
        }

        D3DXSaveSurfaceToFile(TEXT("f:\\test555.bmp"),D3DXIFF_BMP,pLockSurface,NULL,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"------------------------End:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        if (pBackSurface) pBackSurface->Release();
        if (pLockSurface) pLockSurface->Release();
输出信息为:
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:219
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:235
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:234
并且保存的位图文件,是和Surface不相干的图像。很奇怪的现象。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-6-1 11:48:00 | 显示全部楼层

Re: 能提高D3DXLoadSurfaceFromSurface的执行速度?

测试代码为:(使用D3DPOOL_SYSTEMMEM)
        IDirect3DSurface9 *pBackSurface=NULL;
        IDirect3DSurface9 *pLockSurface=NULL;

        //m_D3DDev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackSurface);
        m_D3DDev->GetRenderTarget(0, &pBackSurface);
        D3DSURFACE_DESC pDesc;
        pBackSurface->GetDesc(&pDesc);
        D3DDISPLAYMODE d3ddisplaymode;
        m_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);
        char strInfo[512];
        DWORD m_iCount = GetTickCount();
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"----------------------Begin:%d\n",0);
        OutputDebugStringA(strInfo);               
                                                                                                                                                                        // D3DPOOL_DEFAULT  D3DPOOL_SYSTEMMEM
        m_D3DDev->CreateOffscreenPlainSurface(pDesc.Width,pDesc.Height,d3ddisplaymode.Format,D3DPOOL_SYSTEMMEM,&pLockSurface,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"CreateOffscreenPlainSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        RECT m_Rect;
        SetRect(&m_Rect,0,0,pDesc.Width,pDesc.Height);
        m_D3DDev->StretchRect(pBackSurface,&m_Rect,pLockSurface,&m_Rect,D3DTEXF_NONE);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //m_D3DDev->StretchRect(pBackSurface,NULL,pLockSurface,NULL,D3DTEXF_LINEAR);//D3DTEXF_POINT;D3DTEXF_NONE;D3DTEXF_LINEAR
        //D3DXLoadSurfaceFromSurface(pLockSurface, NULL, NULL, pBackSurface, NULL, NULL, D3DX_FILTER_NONE, 0);
        //m_D3DDev->GetRenderTargetData(pBackSurface,pLockSurface);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"-D3DXLoadSurfaceFromSurface:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        D3DLOCKED_RECT d3dlr;
        if (D3D_OK == pLockSurface->LockRect(&d3dlr,NULL,D3DLOCK_DONOTWAIT))//D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_DONOTWAIT|D3DLOCK_NOOVERWRITE|D3DLOCK_READONLY))
        {
                memset(strInfo,0,sizeof(strInfo));
                sprintf(strInfo,"-------------------LockRect:%d\n",GetTickCount() - m_iCount);
                OutputDebugStringA(strInfo);

                pLockSurface->UnlockRect();
        }

        D3DXSaveSurfaceToFile(TEXT("f:\\test555.bmp"),D3DXIFF_BMP,pLockSurface,NULL,NULL);
        memset(strInfo,0,sizeof(strInfo));
        sprintf(strInfo,"------------------------End:%d\n",GetTickCount() - m_iCount);
        OutputDebugStringA(strInfo);

        if (pBackSurface) pBackSurface->Release();
        if (pLockSurface) pLockSurface->Release();
输出信息为:
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:15
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:16
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:15
----------------------Begin:0
CreateOffscreenPlainSurface:16
-D3DXLoadSurfaceFromSurface:16
-------------------LockRect:16
------------------------End:16
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:15
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:16
----------------------Begin:0
CreateOffscreenPlainSurface:0
-D3DXLoadSurfaceFromSurface:0
-------------------LockRect:0
------------------------End:0
但是保存的图像为全黑色的图像,没有任何Surface的内容。

1

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2006-6-1 11:52:00 | 显示全部楼层

Re: 能提高D3DXLoadSurfaceFromSurface的执行速度?

从测试好像发现,页面的创建位置可能是影响速度的主要原因!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 15:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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