D3D里的Present函数性能怎么不稳定?

q06380925 2009-11-02 11:43:08

clock_t start,end;
start = clock();
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
end = clock();

我测试渲染整个640*480的窗口时,end-start总是在32Ms和16Ms两个数跳动,导致画面不流畅。
请高手帮下!!!
...全文
460 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
szl3373 2012-09-25
  • 打赏
  • 举报
回复
初始化D3DPRESENT_PARAMETERS时,把PresentationInterval参数设置为D3DPRESENT_INTERVAL_IMMEDIATE,即立即交换。因为默认参数为D3DPRESENT_INTERVAL_DEFAULT,刷新率是随机的。
lyllm_117228 2009-11-06
  • 打赏
  • 举报
回复
UP
realOffar 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackyjkchen 的回复:]
引用 3 楼 realoffar 的回复:
在WINDOWS下使用GetTickCount()同样也可以做出很精确的FPS


貌似不行,就是应为GetTickCount()精度和clock一样,我才换的1楼
[/Quote]

我估计,之所以认为GetTickCount()精度不够用,只有一个原因,就是对FPS要求这样高那样高,而在自己的图形程序里却只画了一个基于XY轴的小烧饼……

普通游戏渲染时,不会太在意精度15ms。
而且,楼主程序不流畅怎么会跟clock()有关呢?
jackyjkchen 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 realoffar 的回复:]
在WINDOWS下使用GetTickCount()同样也可以做出很精确的FPS
[/Quote]

貌似不行,就是应为GetTickCount()精度和clock一样,我才换的1楼
realOffar 2009-11-03
  • 打赏
  • 举报
回复
在WINDOWS下使用GetTickCount()同样也可以做出很精确的FPS
q06380925 2009-11-03
  • 打赏
  • 举报
回复
应该怎么实现,请教下,谢谢!!!
pady_pady 2009-11-03
  • 打赏
  • 举报
回复
那是你的问题,图片移动应该按运动速度,实时计算当前位置,并画图,而不是每次定时器到达的时候移动相同远的距离。
q06380925 2009-11-03
  • 打赏
  • 举报
回复
1楼的方法我试了,耗时在14和29两个数跳动啊。
其实我的问题是:Present函数渲染相同大小的窗口耗时是否不稳定?
做图片移动时会一顿一顿的...
jackyjkchen 2009-11-02
  • 打赏
  • 举报
回复
我感觉画面不流畅应该不是这个造成的,几ms的差距就不流畅了?
jackyjkchen 2009-11-02
  • 打赏
  • 举报
回复
clock()的精度本来就只有15ms左右,这只能说明耗时在16~32MS之间。

请用这个,高精度的


LARGE_INTEGER begintime;
void TimeStart()
{
QueryPerformanceCounter(&begintime);
}

void TimeDisplay()
{
LARGE_INTEGER endtime,freqtime,resulttime;
QueryPerformanceCounter(&endtime);
QueryPerformanceFrequency(&freqtime);
resulttime.QuadPart = (endtime.QuadPart - begintime.QuadPart) * 1000 / freqtime.QuadPart;
printf("处理时间:%5I64d小时%I64d分%I64d.%03I64d秒",resulttime.QuadPart / 3600000,(resulttime.QuadPart / 60000) % 60,(resulttime.QuadPart /1000) % 60,resulttime.QuadPart % 1000);
}
DXUT框架剖析 DXUT框架剖析(14) 摘要: 控件是用户接口的重要组成部分,为了便于用户操作,为程序界面添加各种控件是非常好的方法。DXUT框架为在Direct3D程序中添加各种控件提供了支持。为了便于加载控件和处理各控件的消息,通常先在窗口中加载对话框,然后在对话框中添加响应的控件,由对话框来管理控件。为了统一管理各个对话框,还需要定义对话框资源管理器类CDXUTDialogResourceManager的一个对象,在程序开始时,调用各个对话框的Init函数和对话框资源管理对象进行初始化 DXUT框架剖析(13) 摘要: DXUT框架对文本绘制进行了封装,提供了类CDXUTHelper来简化文本显示,使用该接口大体分为3个步骤:初始化ID3DXSprite和ID3DXFont对象,显示文本,释放ID3DXSprite和ID3DXFont对象。 DXUT框架剖析(12) 摘要: DXUT暂停函数: DXUTPause:将框架的内部计数器和(或)渲染过程设为暂停状态。 DXUTRenderingPaused:检查当前设备的渲染状态是否处在暂停状态。 DXUTIsTimePaused:检查当前设备的计时器是否处在暂停状态。 DXUT框架剖析(11) 摘要: DXUT统计函数: DXUTGetFPS: 获取当前每秒提交的帧数。 DXUTGetFrameStats:获取一个指向字符串的指针,该字符串包括每秒帧数、分辨率、后台缓冲区格式、深度缓冲区格式。 DXUTGetDeviceStats:获取一个指向字符串的指针,该字符串包括当前设备类型、顶点运算行为和设备名。 DXUT框架剖析(10) 摘要: 管理DXUT框架的函数: DXUTResetFrameworkState: 将框架状态重置为初始默认状态,之前设置的框架状态改变将失效。 DXUTShutdown: 触发程序终止和清空框架。 DXUTGetExitCode: 获取框架的退出代码。 DXUT框架剖析(9) 摘要: 下面列出允许改变DXUT行为和获取内部变量的函数,这些函数在使用DXUT框架的Direct3D程序中是非常实用的。 DXUT框架剖析(8) 摘要: Direct3D API的设计使程序能比较容易地处理各种错误,尽管大多数Direct3D API函数返回HTRSULT值,但只有一部分函数返回设备错误,如D3DERR_DEVICELOST或 D3DERR_DRIVERINTERNALERROR。但是通常的Direct3D应用程序使用多种API函数,当传递的参数不合要求时,将返回 D3DERR_INVALIDCALL。 当开发Direct3D应用程序时,应该检查所有的API调用是否成功,如果出现一个没有预测到的失败调用,应用程序应立即给出通知或记录该错误。使用这种方法,开发人员能很快发现哪些API函数的调用是不正确的。一个正确调用Direct3D API函数的应用程序应能安全地忽略大多数Direct3D API函数的失败调用,除了一些关键性的API函数,如Present()或TestCooperativeLevel(),这些函数返回的错误应用程序不能忽略。 DXUT框架剖析(7) 摘要: 框架也提供了帧事件,它在渲染过程中的每一帧被调用,应用程序应该注册并实现这些回调函数。 DXUT框架剖析(6) 摘要: 在窗口和设备创建好之后,应用程序需要使用消息循环处理窗口消息、更新和渲染场景、处理设备事件。应用程序可以实现自己的消息循环,也可以使用DXUT消息循环,注册相应的回调函数,可以让DXUT处理设备、帧消息事件。 为使用DXUT框架的消息循环,可以调用DXUTMainLoop()函数. DXUT框架剖析(5) 摘要: 应用程序可以通过DXUTSetCallbackDeviceChanging()设置回调函数来修改Direct3D设备的创建设置。 回调函数ModifyDeviceSettings()返回一个布尔值,如果应用程序返回 TRUE,DXUT框架继续像在正常情况下那样进行设备创建。如果返回FALSE,框架不能改变设备,如果已有一个设备,则继续使用当前设备。如果框架提出的请求是改变到一个应用程序不能使用的设备,应用程序可以拒绝该请求。例如,在一个多显示器配置中,默认情况下在显示器之间拖动窗口将使框架改变设备。但如果应用程序不能使用其他设备,它就必须拒绝这种改变并继续使用当前设备。 DXUT框架剖析(4) 摘要: 通常可以用标准的Direct3D方法Creat

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧