游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3753|回复: 8

为什么FPS会慢?

[复制链接]

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2003-10-29 12:34:00 | 显示全部楼层 |阅读模式
我仅在全屏下卷动显示一幅较大图片而已,为什么FPS只有20左右?

我用VC7 + DX9 SDK,没用MFC
机器DELL C640 2.4G 512M DDR
怎么说也不应该慢啊
我用GDI做同样的事情,还有30几帧呐

90

主题

797

帖子

833

积分

高级会员

论坛版主

Rank: 4

积分
833
QQ
发表于 2003-10-29 17:06:00 | 显示全部楼层

Re:为什么FPS会慢?

不清楚你的方案
说说你的思路

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2003-10-29 18:40:00 | 显示全部楼层

Re:为什么FPS会慢?

其实我的东西很简单,仅做一个测试来决定我的程序用GDI来写还是DirectX来写。
我创建了三个表面,前后表面之外还有一个Offscreen,Offscreen装载了一幅2560×1280的图片,每次UpdateFrame的时候我就根据卷动的位置,将屏幕大小的内容BltFast到BackSurface,然后Flip。所以UpdateFrame只作BltFast和Flip两件事情。但即便如此,FPS也只有20几帧。(800*600 32BPP)
然而同样的事情,我用GDI函数实现却可以达到30帧以上,为什么会这样呐???

35

主题

105

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2003-10-29 23:32:00 | 显示全部楼层

Re: Re:为什么FPS会慢?

如果LOAD~800*600的图片谁更快呢?

37

主题

378

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2003-10-30 18:17:00 | 显示全部楼层

Re:为什么FPS会慢?

不知道你调用D3D9的Device没(注意不是DDRAW的某个版本)?
最好把你的代码拷贝出来一部分

2

主题

106

帖子

114

积分

注册会员

Rank: 2

积分
114
QQ
发表于 2003-10-30 20:27:00 | 显示全部楼层

Re:为什么FPS会慢?

较大的图片,DX渲染的时候,不会帮你修剪,只会全部渲染,即使看不到的部分也照样渲染,因此速度比较慢,你必须手动修剪。GDI显示的时候windows会只选出你要显示的部分来显示,等于说不会渲染整个图片,只渲染要显示的部分,因此速度要快些。

69

主题

335

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
发表于 2003-10-30 21:50:00 | 显示全部楼层

Re:为什么FPS会慢?


你那个图是挺大的2560×1280,32
缓冲需要的mem大小=13,107,200字节,大概13Mb,你应该2个缓冲,就是26mb,所以你的显卡如果小与26mb就难说呢。。。不知道是不是这问题,先弄个小图实验一下

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2003-10-31 09:35:00 | 显示全部楼层

Re:为什么FPS会慢?

主要代码如下,看不出为什么会慢哦


HRESULT Initialize()
{
        // .........
        // 初始化屏幕 800 * 600, 32BPP,略
        // .........

        HBITMAP hBmp = (HBITMAP)LoadImage(NULL, bmpfile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
        if(hBmp == NULL)
        {
                TRACE("Load Resource Bitmap File Failed: %s\n", bmpfile);
                MessageBox(NULL, "Load Resource Bitmap File Failed.", "Error", MB_OK);
                return S_FALSE;
        }

        BITMAP bmpInfo;
        GetObject(hBmp, sizeof(BITMAP), &bmpInfo);

        // 创建的离屏表面与图片一样大
        DDSURFACEDESC2 ddsd;
        ZeroMemory(&ddsd, sizeof(ddsd));
        ddsd.dwSize = sizeof(ddsd);
        ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
        ddsd.dwWidth = bmpInfo.bmWidth;
        ddsd.dwHeight = bmpInfo.bmHeight;
        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;

        HRESULT hRes = lpddsOffscreen->CreateSurface(&ddsd, lpdds, NULL);
        if(FAILED(hRes))
        {
                TRACE("CREATE SURFACE FAILED WHEN LOADING BITMAP: %s\n", bmpfile);
                return false;
        }

        // 将图片内容拷贝到表面
        HDC hTmpDC, hDC;
        if((hRes = lpddsOffscreen->GetDC(&hDC)) != DD_OK)
                return S_FALSE;

        hTmpDC = CreateCompatibleDC(hDC);
        SelectObject(hTmpDC, hBmp);

        BitBlt(hDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, hTmpDC, 0, 0, SRCCOPY);
        lpddsOffscreen->ReleaseDC(hDC);

        // 删除临时句柄
        DeleteDC(hTmpDC);
        DeleteObject(hBmp);
       
        return S_OK;
}

HRESULT MainLoop()
{
        static int xOffset = 0, yOffset = 0;
        // 检验按键信息
        if(KeyPressed())
        {
                DWORD Key = GetKey();
                switch(Key)
                {
                case VK_UP:
                        yOffset -= 5;break;
                case VK_DOWN:
                        yOffset += 5;break;
                case VK_LEFT:
                        xOffset -= 5;break;
                case VK_RIGHT:
                        xOffset += 5;break;
                default:break;
                }
        }

        // xOffset, yOffset 边界检验,略
        // ... ...

        // 拷屏
        RECT rt = {xOffset, yOffset, xOffset+800, yOffset+600};
        HRESULT hr = lpddsBack->BltFast(0, 0, lpddsOffscreen, &rt, DDBLT_WAIT);
        if(FAILED(hr))
        {
                TRACE("BLTFAST CALLED FAILED. (lpddsOffscreen -> lpddsBack)\n");
                return hr;
        }

        // 页面翻转
        return lpddsFront->Flip();
}

13

主题

62

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2003-11-4 11:03:00 | 显示全部楼层

Re:为什么FPS会慢?

图片太大了啊,用photoshop把图片改成索引色模式,会提高不少。
我现在用了一幅4000*3000的大地图,怎么弄fps也很低,后来把它分割成250*250的小图动态载入还稍微好一些。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-23 22:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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