游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2550|回复: 5

诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?

[复制链接]

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2007-1-17 23:11:00 | 显示全部楼层 |阅读模式
我的游戏循环是这样的:
//游戏循环
while(TRUE){
    if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){   
        if (0 == GetMessage(&msg, NULL, 0, 0)){
            return (int)msg.wParam;
        }
       TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    tNow = GetTickCount();//取得系统当前时间               
    tInterval = tNow - tLastFrame;
    //刷新前的事件处理
    if( !m_listener->FrameStartEvent(tInterval) ){//如果刷新事件返回值为假
        break;
    }
    //刷新部分
    D3DDEVICE->Clear( 0 , 0 , D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER , D3DCOLOR_XRGB(0,0,0) , 1.0f , 0 );
    D3DDEVICE->BeginScene();
    m_listener->Render();
    D3DDEVICE->EndScene();
    D3DDEVICE-&gtresent(NULL, NULL, NULL, NULL);//刷新
    //刷新后的事件处理
    if( !m_listener->FrameEndEvent(tInterval) ){//如果刷新事件返回值为假
         break;
    }
    tLastFrame = tNow;
}
我把前后时间处理函数和刷新函数基本都架空了,只剩下贴了一串文字显示刷新率和计算刷新率的式子.但显示出来的刷新率却只在33到50之间徘徊.为什么会这么慢呢?
另外这是D3D创建的函数,各位大大们看看有没问题
//建立绘图设备
        D3DPRESENT_PARAMETERS d3dpp;
        memset( &d3dpp , 0 , sizeof( d3dpp ));
        d3dpp.Windowed                                        = isWindows;
        d3dpp.BackBufferFormat                        = d3ddm.Format;
        d3dpp.BackBufferCount                        = 1;//后备缓冲的数目
        d3dpp.BackBufferWidth                        = SCREENPELSX;//后备缓冲的宽度和高度
    d3dpp.BackBufferHeight                        = SCREENPELSY;
        d3dpp.SwapEffect                                = D3DSWAPEFFECT_DISCARD;//交换缓冲支持的效果类型
        d3dpp.hDeviceWindow                                = HWINDOW ;//显示设备输出窗口的句柄
        d3dpp.Flags                                                = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3dpp.AutoDepthStencilFormat        = D3DFMT_D16;
    d3dpp.EnableAutoDepthStencil        = TRUE;

        if( D3D->CreateDevice( D3DADAPTER_DEFAULT ,
                D3DDEVTYPE_HAL , HWINDOW , D3DCREATE_HARDWARE_VERTEXPROCESSING ,
                &d3dpp , &D3DDEVICE ) != D3D_OK )
[em24] [em24] [em24]

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2007-1-17 23:12:00 | 显示全部楼层

Re:诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?

另外刷新率的计算:
frameNum = 1000/tInterval;
这个不会错吧?

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-1-18 09:22:00 | 显示全部楼层

Re:诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?

汗一个,楼主的统计方法真是别致。
虽然看起来是可以的,产生这个结果主要是GetTickCount导致的。精确度太低。
fps 一般都是 桢数/时间 一般会考虑连续一段时间的平均值,这样比较稳定。
你 用 1秒/桢间隔,太依赖于桢间隔的稳定性。

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2007-1-18 14:17:00 | 显示全部楼层

Re:诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?

    我去试了一下,应该不是算的问题.我把式子改成了
    if(1000/tInterval > msxFPS )
    {
        msxFPS = 1000/tInterval
    }
总是求最大刷新率,结果无论如何只有100
后来我直接在控制台下写了个while循环
void main()
{
    unsigned long tNow = 0;
    unsigned long tLastFrame = 0;
    unsigned long tInterval = 0
    int FPS;
    while(ture)
    {
        tNow = GetTickCount();
        tInterval = tNow - tLastFrame;
        if(tInterval >0)
        {
            FPS = 1000/tInterval;
        }
        cout << FPS;
        tLastFrame = tNow;
    }
}
让我郁闷的是,这个东西居然都只有100.WHY?难道while循环还有速度上限?

0

主题

17

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2007-1-18 14:43:00 | 显示全部楼层

Re:诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?

首先说说楼主的第一个例子,你在初始化D3D时,应指定:d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE(如果你想刷得快)。对于第二个例子,你写一个循环拼命输出字符,效率当然很慢,速度限制在cout<<FPS这一句上面,和while没有关系

0

主题

17

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2007-1-18 14:44:00 | 显示全部楼层

Re:诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?

而且最好改进一下计算FPS的公式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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