|
|
昨天发了个"为什么我的帧率就是上不去?"的贴,大家这么热情讨论和跟帖,真是很感谢..现在问题已经解决了,大致总结如下,希望对遇到类似问题的朋友有帮助
如果你的程序帧率上不去,请看看下面的几个问题你注意了没有
1. 如果是程序算法本来就很复杂,导致帧率下降的话,那没其他的办法了,只能优化算法或减少三角形数量
2. 是否用了多个光源。 光源对帧率有不少的影响,请斟酌使用
3. 是否使用了很多效果,特别是使用了显卡不支持的,需要软模拟的效果,这样会减少大量帧率
4. Render() 调用位置不当
一般的 Render() 调用都应该放在 CALLBACK MsgProc 里的 WM_PAINT 消息处理中,或者直接放到主消息循环里,除特殊要求外不需要也不要放到其他地方,否则有可能影响帧率
5. PresentationInterval 的设置
D3DPRESENT_PARAMETERS 里的 PresentationInterval 除特殊情况外,要设置成 D3DPRESENT_INTERVAL_IMMEDIATE ,否则对帧率有一定的影响(但不会太大)
stPresentParam.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
6. 最关键的是这个! CreateVertexBuffer
创建顶点池时,顶点池数据的读写属性对帧率有巨大影响!!
如果你只是想渲染池内数据,而不需要对池内数据作读操作时(大部分程序都不需要读池内数据的),请务必用 D3DUSAGE_WRITEONLY 标志建立池!
如果真的是因为这个影响了你的帧率,那你改完后会发现帧率有质的飞跃。
g_pd3ddevice->CreateVertexBuffer(三角形数*3*sizeof(CUSTOMVERTEX),D3DUSAGE_WRITEONLY,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL);
7. 另外,我觉得如果是纯渲染的话,渲染结构对帧率的影响不大,如下:
不用灯光,用以下渲染结构(单个渲染)时:
UINT n;
for(n=0;n<三角形数;n++)
{
g_pd3ddevice->DrawPrimitive (D3DPT_TRIANGLELIST,n*3,1);
}
每帧 40000 个三角形时,帧率为 245 帧
每帧 80000 个三角形时,帧率为 102 帧
每帧 160000 个三角形时,帧率为 45 帧
每帧 240000 个三角形时,帧率为 32 帧
每帧 320000 个三角形时,帧率为 23 帧
每帧 480000 个三角形时,帧率为 16 帧
每帧 640000 个三角形时,帧率为 11 帧
.
.
不用灯光,用以下渲染结构时:
g_pd3ddevice->DrawPrimitive (D3DPT_TRIANGLELIST,0,三角形数);
每帧 40000 个三角形时,帧率为 256 帧
每帧 80000 个三角形时,帧率为 100 帧
每帧 160000 个三角形时,帧率为 51 帧
每帧 240000 个三角形时,帧率为 35 帧
每帧 320000 个三角形时,帧率为 26 帧
每帧 480000 个三角形时,帧率为 17 帧
每帧 640000 个三角形时,帧率为 13 帧
.
.
可得,单个渲染个群体渲染的帧率相差不大
只是不知道有没有注意到,帧率和三角形数是成反比例的,这样好象挺合逻辑的,但我有一点想不通,为什么 40000 到 80000 时只增加了40000 个三角形,帧率就减了150几,而后面的 160000 到 640000 ,增加了480000 个,帧率才减了38左右?
我暂时大概就想到这些了,也不知道对不对,大家有什么意见可以再讨论一下
昨天最大的问题就是第6个那个CreateVertexBuffer的问题,现在已经可以了
|
|