诚心请教:一个用DirectX3d9做的游戏,刷新率为什么这么低?
我的游戏循环是这样的:
//游戏循环
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-> Present(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 )
[解决办法]
看sdk当中的描述
d3dpp.PresentationInterval 他控制刷新速度
The maximum rate at which the swap chain 's back buffers can be presented to the front buffer. For a detailed explanation of the modes and the intervals that are supported, see D3DPRESENT.
这块你怎么设置的
按照你的做法: memset( &d3dpp , 0 , sizeof( d3dpp ));
这个PresentationIntrval的数值就是 D3DPRESENT_INTERVAL_ONE
显示器的刷新速度就是你的窗口刷新上限了
你可以设置成为: D3DPRESENT_INTERVAL_IMMEDIATE 无限刷新