【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 6100|回复: 17

D3DSprite的诡异问题,为什么有时候运行不流畅?

[复制链接]
发表于 2005-9-1 16:51:42 | 显示全部楼层 |阅读模式

用的是窗口模式,只是clear一下,然后画鼠标和几个方块。
刚开机的时候,运行起来不流畅,跳帧,大概每刷新2,3次就跳一下,fps从100跳到30多。然后一直都这样,关闭了再打开也是如此。
但当我打开ie,再打开csdn之类(图片比较多?)网站后,再运行我的程序,就很流畅了。
到底是怎么回事?
以下是创建过程的代码。。我看了一下跟大家的也没什么不同。。关键是有时很流畅,有时一直跳桢。而且刚开机以后肯定一直跳桢。我还干了这么一件事:

 HANDLE hProcess = GetCurrentProcess();
 SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS    );

毫无改观。。

[em12]

pD3D = Direct3DCreate9(D3D_SDK_VERSION);
 pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm); 
 ZeroMemory(&d3dpp, sizeof(d3dpp));

 d3dpp.Windowed = TRUE;
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &pDev );

 pDev->SetRenderState( D3DRS_LIGHTING, FALSE );
 pDev->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );

pDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);

 D3DXCreateTextureFromFileEx(pDev, ".//bmp//cursor.jpg", 40, 40, 1, D3DPOOL_DEFAULT,
 D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_FILTER_NONE,
 D3DX_FILTER_NONE,D3DCOLOR_XRGB(0,255,0) , NULL, NULL, &CursorTex);

发表于 2005-9-1 17:10:17 | 显示全部楼层
################
 楼主| 发表于 2005-9-1 19:52:53 | 显示全部楼层
################
发表于 2005-9-1 19:58:43 | 显示全部楼层
那肯定是打开纹理要用的某个缓冲,你仔细看看吧
 楼主| 发表于 2005-9-1 22:08:26 | 显示全部楼层
好的。。我再研究研究。。呵呵
 楼主| 发表于 2005-9-2 00:43:48 | 显示全部楼层
################
 楼主| 发表于 2005-9-2 01:17:44 | 显示全部楼层
################
发表于 2005-9-2 13:11:11 | 显示全部楼层
################
 楼主| 发表于 2005-9-2 13:32:40 | 显示全部楼层

终于。。基本上解决了

Timer resolution - the D3DPRESENT_INTERVAL_DEFAULT member of D3DPRESENT_PARAMETERS uses the default system timer resolution whereas the D3DPRESENT_INTERVAL_ONE member of D3DPRESENT_PARAMETERS calls timeBeginPeriod(1) to enhance system timer resolution. This improves the quality of vertical sync, but consumes slightly more processing time. Both parameters attempt to synchronize vertically.

 

用D3DPRESENT_INTERVAL_ONE就可以了。。原来用的都是 D3DPRESENT_INTERVAL_DEFAULT

但和flash的关系还是没搞清楚。。不过也管不了了呵呵

发表于 2005-9-2 17:28:46 | 显示全部楼层

这个函数你是用来控制什么的?

 楼主| 发表于 2005-9-2 19:46:54 | 显示全部楼层

 建立设备的时候的传入参数 ,

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory(&d3dpp, sizeof(d3dpp)); //清空d3dpp,准备填充内容

 
  d3dpp.Windowed = TRUE;
  d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  d3dpp.PresentationInterval=D3DPRESENT_INTERVAL_ONE;//似乎是用来控制刷新率

 pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,  D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,                         &pDev );

发表于 2005-9-3 01:26:56 | 显示全部楼层
################
发表于 2005-9-3 15:52:28 | 显示全部楼层

PresentationInterval  指定后台缓冲与前台缓冲的交换频率
我们普通是用
PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
这时是时时刷新,立即显示刷新后的图像,渲染速度反映真是速度,CPU占用率很高
如果设为
PresentationInterval=D3DPRESENT_INTERVAL_ONE;
和全屏时的刷新方式差不多,FPS会固定在一个数值,CPU占用就会很节省

我猜想,flash里面可能有个参数设置,将系统的PresentationInterval=D3DPRESENT_INTERVAL_ONE;所以运行flash播放器以后你的程序画面就流畅了。

发表于 2005-9-5 22:20:36 | 显示全部楼层

首先谢谢各位,我之前也有这个问题,用了D3DPRESENT_INTERVAL_ONE这个参数后果然好多了,原来帧数限制调到60时会有最多15以上的波动,现在最多也就浮动2帧或3帧,甚至调到80帧都能比较有效的控制帧数的稳定。

在这里顺便问一下,各位都是用什么方式限制帧数的呢?我用的是性能计数器,不知道这种方法的性能和效率怎么样,代码如下

//全局变量:

LARGE_INTEGER SystemClock;
LARGE_INTEGER ClockPointOld,ClockPointNew;

 

//取性能计数器运行频率,在程序初始化时加入:

QueryPerformanceFrequency(&SystemClock);

//加入到渲染循环中(那个60就是指限制在60帧):
    for(;;)
    {
     QueryPerformanceCounter(&ClockPointNew);
     if((ClockPointNew.QuadPart-ClockPointOld.QuadPart)*60 > SystemClock.QuadPart)
     {
      ClockPointOld = ClockPointNew;
      break;
     }
    }

 

发表于 2005-9-5 23:59:48 | 显示全部楼层
################
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 08:54

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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